一篇文章没看懂,大家帮忙看一下,帮顶有分
主从Grid数据的保存
主从Grid,通过DataRelation连接,以实现表间关联。但是在新增、删除、修改时,就需要留意对DataRelation的影响。当主Grid是新增加的,从Grid增加行时,关联的键值不能自动读入,需要手工输入。
// 如果主Grid当前数据新增的:
if(((DataRowView)this.BindingContext[objMyDataSet,主Grid源].Current)
.Row.RowState == DataRowState.Added)
((DataRowView)this.BindingContext[objMyDataSet,从Grid源]
.Current)[关联列]
= ((DataRowView)this.BindingContext[objMyDataSet,主Grid源]
.Current)[关联列];
同时,从Grid增加行的事件中,必须让主Grid接受窗体上的数据。比如:
try
{
// 清除当前编辑内容
// 主Grid接受数据
this.BindingContext[objMyDataSet,主Grid源].EndCurrentEdit();
// 从Grid接受数据
this.BindingContext[objMyDataSet,从Grid源].EndCurrentEdit();
this.BindingContext[objMyDataSet,从Grid源].AddNew();
}
catch (System.Exception eEndEdit)
{
System.Windows.Forms.MessageBox.Show(eEndEdit.Message);
}
主从Grid数据的保存(续)
主从Grid数据保存时,必须按照一定顺序:先子表删除,后主表增加、修改、删除,最后子表增加、修改。具体用法和PB一样:
对数据缓冲区,按照行修改标志分别取删除、修改、增加的行,形成三个缓冲区:
1、对删除缓冲区:
objMyDataSetChanges = ((VATA.MyDataSet)
(objMyDataSet.GetChanges(DataRowState.Deleted)));
//子表更新:
objService.myUpdate(objMyDataSetChanges, 查询子表的SQL,子表名);
//主表更新:
objService.myUpdate(objMyDataSetChanges, 查询主表的SQL,主表名);
2、对增加缓冲区:
objMyDataSetChanges = ((VATA.MyDataSet)
(objMyDataSet.GetChanges(DataRowState.Added)));
//主表更新:
objService.myUpdate(objMyDataSetChanges, 查询主表的SQL,主表名);
//子表更新:
objService.myUpdate(objMyDataSetChanges, 查询子表的SQL,子表名);
3、对修改缓冲区:
objMyDataSetChanges = ((VATA.MyDataSet)
(objMyDataSet.GetChanges(DataRowState.Modified)));
//主表更新:
objService.myUpdate(objMyDataSetChanges, 查询主表的SQL,主表名);
//子表更新:
objService.myUpdate(objMyDataSetChanges, 查询子表的SQL,子表名);
和PB不太一样的地方是:PB的数据缓冲区操作没有C#这么方便。针对分离出来的数据缓冲区,PB大多需要手工操作,写SQL语句;C#中ADO.NET只需要指明查询表的语句,就可以自动生成更新的SQL。
产生上面的不同,主要原因在于:C#中ADO.NET是相对独立的,而PB中数据缓冲区和DataWindow或者DataStore结合太紧密。
C#中的ADO.NET,操作主从关系的Grid时,DataRelation必须动态生成。在每次从数据源加载数据时,都需要:
if(objMyDataSet.Relations.Contains("关系名"))
objMyDataSet.Relations.Remove("关系名")
objMyDataSet.Relations.Add(relMawbHawb)
这是由于DataRelation本质上是一张Table,数据内容记录的是主表和从表的对应关系。重新生成该关系,就是重新生成该表。否则,主从表显示不同步。