关于数据修改状态的检测

问题描述

用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原本的特性而不必重写自己的东西

时间: 2024-07-31 19:12:39

关于数据修改状态的检测的相关文章

请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下)

问题描述 请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下) 请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下)thank in advance 解决方案 https://msdn.microsoft.com/zh-cn/magazine/mt147239.aspx

update-SQL 根据表A的数据修改表B,当一条表B的数据匹配到多条表A的数据时选其中一条修改

问题描述 SQL 根据表A的数据修改表B,当一条表B的数据匹配到多条表A的数据时选其中一条修改 update B set _flg = 'update', b_string1 = t4.a_string1, b_string2 = t4.a_string2, b_string3 = t4.a_string3, b_string4 = t4.a_string4, b_string5 = t4.a_string5, update_by = current_user, update_date = ge

用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据

问题描述 用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据 我有一张表,里面3字段id.time.value. 由于value中的部分值异常的大,我想批量修改数据,比如说4.1日-4.20日出现中出现异常大的数据,我想把异常大的数据修改成和他时间段(时间段前或者后)差不多的数据,请问下这个sql应该怎么写啊.我用游标的方法怎么实现.谢谢啊! 解决方案 不知道你的数据库是什么,用MS SQL SERVER示意 建表SQL如下 CREATE TABLE

ata ow-datatable中数据修改出错,,求教

问题描述 datatable中数据修改出错,,求教 for (int i = 0; i < DT.Rows.Count; i++) { string b = ""; string a = DT.Rows[i][6].ToString(); foreach (char c in a.ToCharArray(0, a.Length)) { if (c != Convert.ToChar(' ')) { b += c; } } DT.Rows[i]["行政区"] =

数据库中大量数据修改

问题描述 数据库中大量数据修改 要修改一个表中将近一亿条数据怎么办啊???????????? 我这个是oracle数据库,,业务是这样的:把表名,,和要修改的字段名,传入存储过程中,,在存储过程中根据传入的字段名的加工成另一个值,再update给回去,,业务到没什么,就是数据量太大将近一亿条数据 解决方案 考虑到数据库中的修改,其实是删除+重新插入实现的,所以一次性导出,再复制回去可能更快.具体要看什么数据库引擎. 解决方案二: 你这需求...用导入导出吧. 解决方案三: 是什么数据库,关系型数

asp.net-使用ajax进行数据修改后页面无法正常刷新

问题描述 使用ajax进行数据修改后页面无法正常刷新 我用AJAX对我查询出来的数据进行修改,之后用了window.location.reload();来刷新页面在谷歌没问题在IE却有问题,求各位帮忙看看为什么,求解决方案.我开发的模式用的是asp.net,AJAX请求都是在一般处理程序里面 解决方案 location.reload([bForceGet])参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页. true, 则以GET 方式,从服务端取最新的页面,

oracle数据库中小写数据修改为大学数据

问题描述 oracle数据库中小写数据修改为大学数据 解决方案 用upper函数就可以了. 解决方案二: update 表A set sca_qp=upper(sca_qp) 解决方案三: update 表 set SCA_QP = Upper(SCQ_QP) 可以用Upper或者NLS_Upper Oracle函数(将整个字符串转换为大写) NLS_UPPER(x[y]) [功能]返回字符串并将字符串的转换为大写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls

消息-keepass多语言及密码数据修改代码,求指导

问题描述 keepass多语言及密码数据修改代码,求指导 我根据keepass修改属于自己的程序,遇到两个困难突破不了.求大神指导. 1.keepass多国语言是通过Translate::LoadTranslationTable读取INI文件的字 符串保存到m_vTrlStrings和m_vDefStrings中,并通过m_strTableName判断当前 语言.跟踪到这3个变量之后我找不到后续更改字符串为中文是哪段代码实现的 .我修改成的程序只有部分语言显示中文.求指导keepass多国语言是

Mysql数据库千万数据修改迁移问题

问题描述 Mysql数据库千万数据修改迁移问题 5C 环境:数据库DATA中有三张表分别为 表A.表B.表C 需求:表A中有1200万数据,现在需要将表A中的部分字段数据插入表B中,将表A中剩余部分字段插入表C中,在插入过程中,会对字段数据进行部分处理(如某字段为空,则随机插入写那些).问题: 除了查出表A中的数据然后一条一条处理插入还有什么好的方式能优化效率呢!! 解决方案 MySQL数据库数据位置迁移 解决方案二: 还不是一样用SQL语句啊 解决方案三: 事务应该可以吧,但效率好像不好说 解