如题。
private void btnSearch_Click(object sender, EventArgs e) //查询
{
string sqlMaster = “Select distinct id as 序号,SerialNo as 编号,Name as 姓名 from tb_PersonalInfo”;
string sqlDetail = “Select a.SerialNo as 编号,b.Name as 姓名,a.Treatment as 处置类别 from tb_TreatmentRecord as a Inner Join tb_PersonalInfo as b on a.SerialNo = b.SerialNo”;
using (SqlDataAdapter da = new SqlDataAdapter(sqlMaster, dbc.getcon()))
{
da.Fill(dbSet, “PersonalInfo”); // 填充主表
}
using (SqlDataAdapter da = new SqlDataAdapter(sqlDetail, dbc.getcon()))
{
da.Fill(dbSet, “TreatmentRecord”); // 填充子表
}
DataColumn parentCol = dbSet.Tables[“PersonalInfo”].Columns[“编号”];
DataColumn childCol = dbSet.Tables[“TreatmentRecord”].Columns[“编号”];
DataRelation relation = new DataRelation(“FK_PersonalInfo_TreatmentRecord”, parentCol, childCol, false); // 建立主从关系
dbSet.Relations.Add(relation); // 添加主从关系到数据集中
BindingSource bs_PersonalInfo = new BindingSource();
BindingSource bs_TreatmentRecord = new BindingSource();
bs_PersonalInfo.DataSource = dbSet;
bs_PersonalInfo.DataMember = “PersonalInfo”; // 绑定到数据源——主表
bs_TreatmentRecord.DataSource = bs_PersonalInfo;
bs_TreatmentRecord.DataMember = “FK_PersonalInfo_TreatmentRecord”; // 绑定到关系——从表
dgv_PersonalInfo.DataSource = bs_PersonalInfo;
dgv_TreatmentRec.DataSource = bs_TreatmentRecord;
}
private void btnEdit_Click(object sender, EventArgs e) //修改子表
{
这里写上修改子表内容的代码,即调用一个修改子表的窗口,这里代码本人省略了
btnSearch_Click(sender, e); //本句实际上是模拟点击查询按钮,父表的记录又从头显示
}
以上就是本人的父子表的基本代码,运行后点击btnSearch显示父表和对应子表的内容,一切正常。修改主表某条记录(例如第386条记录)对应的子表的内容后,由于有 btnSearch_Click(sender, e); 这一句,即模拟点击查询按钮,所以用鼠标滚动重新找到并点击父表的第386条记录,就可以看到子表确实已修改成功了。但这有一个很大的问题,就是每次调用修改对应子表的窗口修改过后,运行btnSearch_Click(sender, e);之后父表又回到头一条记录,想看看第386条记录改好了没有就得滚动父表找到第386条记录,才能看到其对应子表的内容,非常麻烦。而去掉btnSearch_Click(sender, e);这一句的话虽然父表记录指针仍指向第386条记录但其对应子表的内容虽经修改却并不会变化。本人把这一句修改为dgv_TreatmentRec.Refresh(); 试试也无效。
问一下各位高手,应该怎么修改代码才能实现在修改父表某条记录对应的子表内容后仍保持父表记录指针不变?谢谢指点!
private void btnSearch_Click(object sender, EventArgs e) //查询
{
string sqlMaster = “Select distinct id as 序号,SerialNo as 编号,Name as 姓名 from tb_PersonalInfo”;
string sqlDetail = “Select a.SerialNo as 编号,b.Name as 姓名,a.Treatment as 处置类别 from tb_TreatmentRecord as a Inner Join tb_PersonalInfo as b on a.SerialNo = b.SerialNo”;
using (SqlDataAdapter da = new SqlDataAdapter(sqlMaster, dbc.getcon()))
{
da.Fill(dbSet, “PersonalInfo”); // 填充主表
}
using (SqlDataAdapter da = new SqlDataAdapter(sqlDetail, dbc.getcon()))
{
da.Fill(dbSet, “TreatmentRecord”); // 填充子表
}
DataColumn parentCol = dbSet.Tables[“PersonalInfo”].Columns[“编号”];
DataColumn childCol = dbSet.Tables[“TreatmentRecord”].Columns[“编号”];
DataRelation relation = new DataRelation(“FK_PersonalInfo_TreatmentRecord”, parentCol, childCol, false); // 建立主从关系
dbSet.Relations.Add(relation); // 添加主从关系到数据集中
BindingSource bs_PersonalInfo = new BindingSource();
BindingSource bs_TreatmentRecord = new BindingSource();
bs_PersonalInfo.DataSource = dbSet;
bs_PersonalInfo.DataMember = “PersonalInfo”; // 绑定到数据源——主表
bs_TreatmentRecord.DataSource = bs_PersonalInfo;
bs_TreatmentRecord.DataMember = “FK_PersonalInfo_TreatmentRecord”; // 绑定到关系——从表
dgv_PersonalInfo.DataSource = bs_PersonalInfo;
dgv_TreatmentRec.DataSource = bs_TreatmentRecord;
}
private void btnEdit_Click(object sender, EventArgs e) //修改子表
{
这里写上修改子表内容的代码,即调用一个修改子表的窗口,这里代码本人省略了
btnSearch_Click(sender, e); //本句实际上是模拟点击查询按钮,父表的记录又从头显示
}
以上就是本人的父子表的基本代码,运行后点击btnSearch显示父表和对应子表的内容,一切正常。修改主表某条记录(例如第386条记录)对应的子表的内容后,由于有 btnSearch_Click(sender, e); 这一句,即模拟点击查询按钮,所以用鼠标滚动重新找到并点击父表的第386条记录,就可以看到子表确实已修改成功了。但这有一个很大的问题,就是每次调用修改对应子表的窗口修改过后,运行btnSearch_Click(sender, e);之后父表又回到头一条记录,想看看第386条记录改好了没有就得滚动父表找到第386条记录,才能看到其对应子表的内容,非常麻烦。而去掉btnSearch_Click(sender, e);这一句的话虽然父表记录指针仍指向第386条记录但其对应子表的内容虽经修改却并不会变化。本人把这一句修改为dgv_TreatmentRec.Refresh(); 试试也无效。
问一下各位高手,应该怎么修改代码才能实现在修改父表某条记录对应的子表内容后仍保持父表记录指针不变?谢谢指点!
解决方案
20
记录下要修改数据的行数,更新完后selectIndex或其他属性设置为之前记录的行数,自动跳转过去.
没有办法避免刷新
没有办法避免刷新