winform下如何判断datagridview中的新增、删除、修改状态

问题描述

在datagridview中的进行新增行、删除行、修改行操作,通过按钮button进行统一判断,需要判断哪些行是新增、被删除行、被修改,然后再提交给服务器代码入下定义一个DataTabledt=newDataTable();然后赋值如dt=bll.GetDrList(txtCustOrderId.Text.Trim()).Tables[0];dataGridView1.DataSource=dt;现在判断DataRowState的状态来执行不同的方法如DataTablecdt=dt.GetChanges();for(inti=0;i<cdt.Rows.Count;i++){if(cdt.Rows[i].RowState==DataRowState.Deleted){删除方法}elseif(cdt.Rows[i].RowState==DataRowState.Modified){更新方法}elseif(cdt.Rows[i].RowState==DataRowState.Added){新增方法}但是有一种情况比如用户将某行删除了然后又添加了一行一样的数据,这个时候提示不能通过已删除的行访问该行的信息如何解决呢????

解决方案

解决方案二:
代码不能充分看出问题所在,你可以自己搜索“不能通过已删除的行访问该行的信息”,有很多类似解决方法
解决方案三:
我知道是什么原因就是因为我删除了改行已经标注为状态为Deleted,不能读取该行的数据了现在假设假设用户在操作datagridview时删除了某行这个时候它发现删除错了于是它点新增当发现新增的数据跟之前的数据其实是一样的它希望将之前标记Deleted回滚假设datagridivew是这样的料号单价数量A3.550B580假设用户将B这行删除了使用前面的方法dt.Rows[i].Delete();这时第二行标记为Deleted可是用户发现不能删除了于是它新增一条数据这个时候就判断如果删除的数据跟增加的数据料号是一样的则删除那条就回滚如何操作呢因为我要判断新增的数据和删除的数据料号是否相等所以我要访问标记为Deleted该如何操作谢谢
解决方案四:
删除操作要这样来for(inti=cdt.Rows.Count-1;i>=0cdt.Rows.Count;i--)
解决方案五:
上面无视,混了些奇怪的东西for(inti=cdt.Rows.Count-1;i>=0;i--)
解决方案六:
你一定要正着循环也可以,但是删除后要记得i--
解决方案七:
引用4楼shingoscar的回复:

上面无视,混了些奇怪的东西for(inti=cdt.Rows.Count-1;i>=0;i--)

这个方法不行吧通过按钮button进行统一判断,需要判断哪些行是新增、被删除行、被修改,然后再提交给服务器
解决方案八:
引用6楼maocheng82的回复:

Quote: 引用4楼shingoscar的回复:
上面无视,混了些奇怪的东西for(inti=cdt.Rows.Count-1;i>=0;i--)

这个方法不行吧通过按钮button进行统一判断,需要判断哪些行是新增、被删除行、被修改,然后再提交给服务器

循环的方向和你说的有关系吗?
解决方案九:
引用7楼shingoscar的回复:

Quote: 引用6楼maocheng82的回复:
Quote: 引用4楼shingoscar的回复:
上面无视,混了些奇怪的东西for(inti=cdt.Rows.Count-1;i>=0;i--)

这个方法不行吧通过按钮button进行统一判断,需要判断哪些行是新增行、删除行、修改行,然后再提交给服务器

循环的方向和你说的有关系吗?

什么意思?是不是删除行的时候定义一个变量将删除行的值赋予给它增加行的时候来判断这个变量是新增还是更新
解决方案十:
好好的datatable,本来能自动识别和更新,偏要分出增删改来再独立处理,给你用成这个样子,就是自找麻烦
解决方案十一:
你实在想跟踪,就用datatable的RowDeleted事件,记录下来
解决方案十二:
引用10楼daixf_csdn的回复:

你实在想跟踪,就用datatable的RowDeleted事件,记录下来

也许我说的不是很清楚我再描叙哈假设datagridview打开上是这样的料号数量A100B200C500在上面增加行修改行删除行所对应的方法是不一样的代码写成这样DataTablecdt=dt.GetChanges();///dt就是datagridview.datasoucefor(inti=0;i<cdt.Rows.Count;i++){if(cdt.Rows[i].RowState==DataRowState.Deleted){删除方法}elseif(cdt.Rows[i].RowState==DataRowState.Modified){更新方法}elseif(cdt.Rows[i].RowState==DataRowState.Added){新增方法}现在有一种情况假设用户将料号为C的那行删除了,即dt.Rows[2].Delete();可是发现删除错误了又希望将这条记录添加回来此时RowState就会有两个状态即Deleted和Added如果按照上面的代码就等于分别要执行删除和新增方法。而实际我希望它不执行任何代码
解决方案十三:
引用9楼daixf_csdn的回复:

好好的datatable,本来能自动识别和更新,偏要分出增删改来再独立处理,给你用成这个样子,就是自找麻烦

我想要判断啊如果是更新好几个表都要改变比如(if 是更新){updatetb1...updatetb2..insertintotb3..}不是简单的更新一个表sda.update(dt)
解决方案十四:
引用楼主maocheng82的回复:

在datagridview中的进行新增行、删除行、修改行操作,通过按钮button进行统一判断,需要判断哪些行是新增、被删除行、被修改,然后再提交给服务器代码入下定义一个DataTabledt=newDataTable();然后赋值如dt=bll.GetDrList(txtCustOrderId.Text.Trim()).Tables[0];dataGridView1.DataSource=dt;现在判断DataRowState的状态来执行不同的方法如DataTablecdt=dt.GetChanges();for(inti=0;i<cdt.Rows.Count;i++){if(cdt.Rows[i].RowState==DataRowState.Deleted){删除方法}elseif(cdt.Rows[i].RowState==DataRowState.Modified){更新方法}elseif(cdt.Rows[i].RowState==DataRowState.Added){新增方法}但是有一种情况比如用户将某行删除了然后又添加了一行一样的数据,这个时候提示不能通过已删除的行访问该行的信息如何解决呢????

你的思路错了,由于DataGridView是绑定数据源DataTable的所以你需要知道的是DataTable中的数据状态vartable=newDataTable();table.GetChanges(DataRowState.Added);table.GetChanges(DataRowState.Deleted);table.GetChanges(DataRowState.Modified);

解决方案十五:
引用13楼qqamoon的回复:

Quote: 引用楼主maocheng82的回复:
在datagridview中的进行新增行、删除行、修改行操作,通过按钮button进行统一判断,需要判断哪些行是新增、被删除行、被修改,然后再提交给服务器代码入下定义一个DataTabledt=newDataTable();然后赋值如dt=bll.GetDrList(txtCustOrderId.Text.Trim()).Tables[0];dataGridView1.DataSource=dt;现在判断DataRowState的状态来执行不同的方法如DataTablecdt=dt.GetChanges();for(inti=0;i<cdt.Rows.Count;i++){if(cdt.Rows[i].RowState==DataRowState.Deleted){删除方法}elseif(cdt.Rows[i].RowState==DataRowState.Modified){更新方法}elseif(cdt.Rows[i].RowState==DataRowState.Added){新增方法}但是有一种情况比如用户将某行删除了然后又添加了一行一样的数据,这个时候提示不能通过已删除的行访问该行的信息如何解决呢????

你的思路错了,由于DataGridView是绑定数据源DataTable的所以你需要知道的是DataTable中的数据状态vartable=newDataTable();table.GetChanges(DataRowState.Added);table.GetChanges(DataRowState.Deleted);table.GetChanges(DataRowState.Modified);

是这样的啊我点保存的时候是判断DataTable中的每行数据状态从而执行不同的命令但是有一种情况就是我把这行删除了后来又增加上去了这个情况怎么弄因为按照我上面的写法它将会执行Deleted,Added两种状态
解决方案:
引用14楼maocheng82的回复:

是这样的啊我点保存的时候是判断DataTable中的每行数据状态从而执行不同的命令但是有一种情况就是我把这行删除了后来又增加上去了这个情况怎么弄因为按照我上面的写法它将会执行Deleted,Added两种状态

你所说的情况其实是一种撤销,当然,如果添加数据时使用的是NewRow则会有Delete和Add2个操作而不是同一行有Deleted和Added2个状态DataTable.AcceptChanges();方法将当前所有的更改进行提交,DataTable.RejectChanges();方法将之前的所有更改进行回滚。
解决方案:
引用15楼qqamoon的回复:

Quote: 引用14楼maocheng82的回复:
是这样的啊我点保存的时候是判断DataTable中的每行数据状态从而执行不同的命令但是有一种情况就是我把这行删除了后来又增加上去了这个情况怎么弄因为按照我上面的写法它将会执行Deleted,Added两种状态

你所说的情况其实是一种撤销,当然,如果添加数据时使用的是NewRow则会有Delete和Add2个操作而不是同一行有Deleted和Added2个状态DataTable.AcceptChanges();方法将当前所有的更改进行提交,DataTable.RejectChanges();方法将之前的所有更改进行回滚。

不是同一行是datatable里面就会有两行分别状态是Deleted和Added比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候datatable里面有一行是Deleted这个时候用户发现删除错误了然后又将这条记录添加上去了这个时候又多了一行是Added最后用户点保存的时候判断行的状态会执行两种状态实际上是我希望用户用户将物料C记录删除了后来又增加了C我希望DataTable不要增加行只将原来那行物料为C标记为Deleted的回滚不知道大家明白我的意思没
解决方案:
引用16楼maocheng82的回复:

不是同一行是datatable里面就会有两行分别状态是Deleted和Added比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候datatable里面有一行是Deleted这个时候用户发现删除错误了然后又将这条记录添加上去了这个时候又多了一行是Added最后用户点保存的时候判断行的状态会执行两种状态实际上是我希望用户用户将物料C记录删除了后来又增加了C我希望DataTable不要增加行只将原来那行物料为C标记为Deleted的回滚不知道大家明白我的意思没

明白的table.Rows[index].RejectChanges();
解决方案:
引用17楼qqamoon的回复:

Quote: 引用16楼maocheng82的回复:
不是同一行是datatable里面就会有两行分别状态是Deleted和Added比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候datatable里面有一行是Deleted这个时候用户发现删除错误了然后又将这条记录添加上去了这个时候又多了一行是Added最后用户点保存的时候判断行的状态会执行两种状态实际上是我希望用户用户将物料C记录删除了后来又增加了C我希望DataTable不要增加行只将原来那行物料为C标记为Deleted的回滚不知道大家明白我的意思没

明白的table.Rows[index].RejectChanges();

关键是index这个值怎么获取的到????也就是我新增一条记录判断table行状态为Deleted的是否有相同的物料号如果有这一行的索引index怎么获取的到??
解决方案:
给你个建议,仅供参考添加个撤销按钮,点击之后弹出一个模式窗口,窗口中加载table.GetChanges(Deleted);方法获取的已删除行,对选择的行使用row.RejectChanges()
解决方案:
引用19楼qqamoon的回复:

给你个建议,仅供参考添加个撤销按钮,点击之后弹出一个模式窗口,窗口中加载table.GetChanges(Deleted);方法获取的已删除行,对选择的行使用row.RejectChanges()

这个方法不行因为我新增物料就是弹出一个窗口然后在该窗口选择所需要的物料如果我删除了某物料然后又添加了该物料这个时候我点撤销弹出一个模式窗口。。。。。所以我用这个方法实现的为了得到它的index我就定义一个数组值就是datagridview第一列物料号的值即{A,B,C}当我新增的时候判断在Deleted的行是否有相同的物料号如果有,就通过该物料号与这个数组打交道从而得到它的索引值从而实现回滚不知道大家有什么好的办法没
解决方案:
如果我删除了某物料然后又添加了该物料这个时候我点撤销弹出一个模式窗口。。。。。这句话不是很明白。又添加了。。。是指新添加了还是从删除的列表中撤消了
解决方案:
引用21楼qqamoon的回复:

如果我删除了某物料然后又添加了该物料这个时候我点撤销弹出一个模式窗口。。。。。这句话不是很明白。又添加了。。。是指新添加了还是从删除的列表中撤消了

因为我新增物料的时候就弹出一个窗口里面有所有的物料比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候用户点新增弹出窗口,窗口里面是所有的物料号包含C那用户将C又添加进去了,这个时候用户点撤销,这个时候弹出一个新窗口,窗口中加载已删除的行。。。。。那这个窗口又包含了C这个物料
解决方案:
纠结这干什么?这.....十几年前,还没有,十几年后呢?http://bbs.csdn.net/topics/391978734?page=2#post-401320344----------------------------------------------1.如果datatable中有一个GUID字段作为MainKey就不会提示[不能通过已删除的行访问该行]吧?2.[datatable]只是net数据库标准操作的一个组件,你想将deleted的恢复的操作不是标准操作的一部分呀.直接将deleted的,remove......?
解决方案:
引用22楼maocheng82的回复:

Quote: 引用21楼qqamoon的回复:
如果我删除了某物料然后又添加了该物料这个时候我点撤销弹出一个模式窗口。。。。。这句话不是很明白。又添加了。。。是指新添加了还是从删除的列表中撤消了

因为我新增物料的时候就弹出一个窗口里面有所有的物料比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候用户点新增弹出窗口,窗口里面是所有的物料号包含C那用户将C又添加进去了,这个时候用户点撤销,这个时候弹出一个新窗口,窗口中加载已删除的行。。。。。那这个窗口又包含了C这个物料

你这个是在做bom吗?
解决方案:
引用24楼qqamoon的回复:

Quote: 引用22楼maocheng82的回复:
Quote: 引用21楼qqamoon的回复:
如果我删除了某物料然后又添加了该物料这个时候我点撤销弹出一个模式窗口。。。。。这句话不是很明白。又添加了。。。是指新添加了还是从删除的列表中撤消了

因为我新增物料的时候就弹出一个窗口里面有所有的物料比如有个表物料数量A1000B2000C3000假设用户将物料C删除了这个时候用户点新增弹出窗口,窗口里面是所有的物料号包含C那用户将C又添加进去了,这个时候用户点撤销,这个时候弹出一个新窗口,窗口中加载已删除的行。。。。。那这个窗口又包含了C这个物料

你这个是在做bom吗?

类似我觉得这个情况应该很常见吧在datagridview操作添加行删除行更新然后点保存后台通过rowstate来执行不同的命令
解决方案:
你的需求是很正常的,但你的实现是很奇异的连数据库系统对增、删、改的反悔,都要借助日志来实现而你却只指望通过几个标志位来实现增加还好说,修改、删除后没有原始数据的副本你如何得以还原?
解决方案:
各人做法不同,只要能实现功能就可以再说,你应该也是初涉这类编程,随着对控件的理解加深,自然会找到属于自己的模式。现在所做的只是一种积累,全当练习呗
解决方案:
引用26楼xuzuning的回复:

你的需求是很正常的,但你的实现是很奇异的连数据库系统对增、删、改的反悔,都要借助日志来实现而你却只指望通过几个标志位来实现增加还好说,修改、删除后没有原始数据的副本你如何得以还原?

修改要获取到原来的值可以通过DataRowVersion.Original就可以获取到原始的值删除了datatable实际上没有真正的删除只是做了个标志Deleted我点保存的时候分别判断table里面的标志位来判断就可以实现了啊
解决方案:
楼上大家都说的很对,你的需求是正常的,但你的解决方案是很糟糕的。也就是非要想在DataTable提供的功能之外,自己搞一套机制,那就是相当于你重写一个DataTable呗!但是,有必要吗?我认为是没有必要的,你自己的解决方案有问题。多想想其他办法,不要一根筋就是觉得自己的想法好,没那回事。
解决方案:
引用26楼xuzuning的回复:

你的需求是很正常的,但你的实现是很奇异的连数据库系统对增、删、改的反悔,都要借助日志来实现而你却只指望通过几个标志位来实现增加还好说,修改、删除后没有原始数据的副本你如何得以还原?

引用29楼daixf_csdn的回复:

楼上大家都说的很对,你的需求是正常的,但你的解决方案是很糟糕的。也就是非要想在DataTable提供的功能之外,自己搞一套机制,那就是相当于你重写一个DataTable呗!但是,有必要吗?我认为是没有必要的,你自己的解决方案有问题。多想想其他办法,不要一根筋就是觉得自己的想法好,没那回事。

能有什么好的办法昨天晚上想了一天通过标志位来实现的确麻烦特别是用户撤销比如用户新增一行又删除相同的一行这个时候标志位就有两行分别标志位Deleted和Added那按照通过标志位来判断最后用户点保存的时候判断行的状态会执行两种状态所以排除了请问大家告诉哈我这个方法如何实现啊因为我很多界面都跟它类似
解决方案:
引用26楼xuzuning的回复:

你的需求是很正常的,但你的实现是很奇异的连数据库系统对增、删、改的反悔,都要借助日志来实现而你却只指望通过几个标志位来实现增加还好说,修改、删除后没有原始数据的副本你如何得以还原?

老大能描叙哈如何实现啊我之前准备这样写的前后两个datatable比较来判断是新增还是更新还是被删除了但是感觉不是个很好的办法
解决方案:
是需要再一个DataTable,但不是原先的做对比,而是作为日志,记录下每次的操作
解决方案:
新增的时候能够进行验证吗,如果已存在就更改删除状态

时间: 2025-01-21 13:44:06

winform下如何判断datagridview中的新增、删除、修改状态的相关文章

C#读取excel显示到dataGridView中,不允许修改,然后保存到SQL SERVER中,如何实现?

问题描述 C#读取excel显示到dataGridView中,不允许修改,然后保存到SQLSERVER中,如何实现?谢谢,QQ:270996889msn:zz123439@sohu.com 解决方案 解决方案二:既然要显示到DGV1.那么用ADO.NET读取到DataTable,见ADO.NET如何读取Excel(下)http://www.cnblogs.com/Jinglecat/archive/2006/08/26/487167.html(这是asp.net的,稍微修改即可,如Excel路径

一起谈.NET技术,关于Winform下,获取Treeview中CheckBox选中项的技巧

背景 今天,在做一个指纹管理平台的界面上,遇到了一些问题,因为公司的基础库中没有针对Winform平台的操作,所以在一个部门选择的场景中,关于如何获取部门TreeView中被选中的项目被难住了.所幸还有一个神器叫做搜索引擎,故谷歌一番,发现Asp.net下的这个问题很好解决,但是关于Winform平台下的类似问题,如凤毛麟角啊! 当然,今天我也是查了很久,终于发现了两篇不错的文章,帮助我解决了这个问题,不敢独享,结合自己对使用其方法的心得,特意记录下来,并通过一个小例子和大家一起分享. 问题是这

datagridview 中数据如何批量修改sql2005 中数据

问题描述 在datagridview中有字段姓名,学号,分数几个字段,行数有多行.数据库中有成绩表,包括姓名,学号,分数.问题1:我想把成绩表中的分数都替换成datagridview中的分数,按照姓名,学号相等条件.请问如何处理.谢谢. 解决方案 解决方案二:循环gridview中的行,然后用姓名,学号作为where条件对分数进行update操作就可以了建议不判断姓名,直接判断学号,学号应该是唯一的主键解决方案三:1.是不是只能用循环,有没有把gridview中的数据当做sql中的一个表来操作.

Win10系统下怎么在任务管理器中添加与删除进程

1. 我们在系统中打开"任务管理器"然后我们点击任务管理器上面的"文件"-"运行新任务"如下图所示: 2. 然后我们以电脑管家为例子,右击它,然后找到电脑管家的安装路径: "C:\Program Files (x86)\Tencent\QQPCMgr\10.11.16575.227\QQPCTray.exe" /showui   3. 运行后,进程添加成功.   4. 删除电脑管家进程也是非常的简单了,我们找到进程. 然后  

如何用C#连接数据库并新增,删除,修改?

问题描述 我要做一个可以对表新增,修改,删除的程序,初学者..请赐教. 解决方案 解决方案二:用SqlCommand类的方法解决方案三://连接数据库stringstrConnection="Provider=Microsoft.Jet.OleDb.4.0;";strConnection+=@"DataSource=DataBaseDB.mdb";OleDbConnectionConn=newOleDbConnection(strConnection);//stri

Mac Pro 利用PHP导出SVN新增或修改过的文件例子

先前在 Windows 操作系统下,习惯用 TortoiseSVN 导出新增或修改过的文件([相当实用]如何让TortoiseSVN导出新增或修改过的文件  ),最近换成了 Mac Pro 笔记本电脑,一时没找到类似 TortoiseSVN 好用的客户端工具.好吧,利用PHP写个导出小工具: 1.工具文件名:svn.php,其内容如下:    代码如下 复制代码  <?php /**  * 导出指定版本之间的差异文件,如 100 和 200 之间的差异则导出 100(不包括) - 200(包括)

datagridview-C# winform DataGridView中输入内容时候有下拉提示(数据库中表的内容)!!!!!

问题描述 C# winform DataGridView中输入内容时候有下拉提示(数据库中表的内容)!!!!! 如题,有参考代码吗 多谢多谢~~~~~~~~~~~~~在线等 最好是有实例代码的 解决方案 那列设置成combox类型列

窗体-在不使用数据库的情况下,如何使用c#的winform ,将Excel导入到datagridview中

问题描述 在不使用数据库的情况下,如何使用c#的winform ,将Excel导入到datagridview中 小弟有个问题求教一下,如何将excel 文件放到VS的剪贴板中,再利用代码读取存储在剪贴板上的数据将其显示在winform的DataGridView中? 解决方案 C#操作EXCEL全解(代码) 提示:运行之前必须先引用Interop.Excel.dll模块 using System; using System.Collections.Generic; using System.Tex

webbrowser-怎么判断网页中的【下一页】按钮没得点了呢

问题描述 怎么判断网页中的[下一页]按钮没得点了呢 怎么判断网页中的下一页没得点了呢 我用webbrowser自动采集数据,但是不知道下一页有几个,那么如果判断下一页是否已经没了,数据已经采集完成了呢 求大大指教呀 解决方案 如果要判断网页里的下一页还有没有,需要研究下一页里的代码,如果看不到代码的话,估计是没法判断