问题描述
用C#做的第一个项目,基于3Layer的考虑,决定用NHibernate做中间层,并且第1,2层已建好,感觉比每一个地方分别用SQL好管理多了.但问题来了,在第3层的UI处,想实现PowerBuilder之Datawindow类似的批量更新时,因DataGridView的数据是从DAO处来的,无DataSet之类的东西做Update检测.想有相应方法,可检测出DGV是否Dirty(这很容易),然后有方法可取出Insert/Deleted/UpdatedCollection,然后将对应记录(这里的记录可不是DataSet的一个ROW,是一个Class的Instance),大家有什么好的建议?.NET内是否有相应的HelperClass?顺道说一下我的方法,自我感觉不太理想.扩充BindingSource类:publicinterfaceIModifiedSet<T>{ICollection<T>Inserted{get;}ICollection<T>Updated{get;}ICollection<T>Deleted{get;}voidAddInserted(Titem);voidRemoveInserted(Titem);voidAddUpdated(Titem);voidRemoveUpdated(Titem);voidAddDeleted(Titem);voidRemoveDeleted(Titem);boolIsDirty{get;}}publicclassSomeSource<T>:BindingSourcewhereT:class{privatereadonlyIModifiedSet<T>mSet=newModifiedSet<T>();protectedSomeSource(){DataSource=typeof(T);}internalIModifiedSet<T>ModifiedSet{get{returnmSet;}}publicoverridevoidRemoveAt(intindex){mSet.AddDeleted(List[index]asT);base.RemoveAt(index);}publicoverridevoidRemove(objectvalue){mSet.AddDeleted(valueasT);base.Remove(value);}publicoverrideobjectAddNew(){Objectrc=base.AddNew();mSet.AddInserted(rcasT);returnrc;}}问题是BindingSource类本身并无定义ItemChanged之类之事件,我还要在DGV的CellEndEdit事件中将捕捉到的Instance放入上边做好的SomeSource类内,类似代码如下:publicclassEditor<T>:DataGridViewwhereT:class{protectedSomeSource<T>fDataSource;publicEditor(){AutoGenerateColumns=false;//thismustbesetinordertomakethoseinvisiblecolumnsdisappearAutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.DisplayedCells;//AllowUserToAddRows=true;thisisnotnecessary,thefDataSourcewilltellmewhattodo//nowpopupsomerecordstherefordemothis.CellEndEdit+=newDataGridViewCellEventHandler(Editor_CellEndEdit);}privatevoidEditor_CellEndEdit(objectsender,DataGridViewCellEventArgse){if(e.RowIndex>=fDataSource.Count)return;fDataSource.ModifiedSet.AddUpdated(fDataSource[e.RowIndex]asT);}protectedoverridevoidDispose(booldisposing){base.Dispose(disposing);fDataSource.Dispose();}publicIModifiedSet<T>ModifiedSet{get{returnfDataSource.ModifiedSet;}}}大家能给小弟一些建议吗?
解决方案
解决方案二:
没人回我自己回,将该instancetransfer至Datatable,然后将DataGridView绑定DataTable,然后用DataTable.GetChanges(),这样基本上可使用.NET原本的特性而不必重写自己的东西