C#中用程序代码修改了datagridview中的数据,保存时只对光标当前行有保存解决办法

C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法

 长江黄鹤 2017-06-26   |  300阅读  |  1转藏

转藏全屏朗读分享

 问题细节:

DataAdapter的update方法可以接收一个datatable参数
 然后运行下列代码来改变行数据,再去更新数据库的数据

foreach (DataGridViewRow i in dataGridView1.Rows) {
    i.Cells[1].Value = "测试一下啦";
    i.Cells[2].Value = "测试一下啦";
    i.Cells[3].Value = "测试一下啦";
   }
   this.bookTableAdapter.Update(this.scottDataSet.book);
总是被选择的行无法更新!

1、原数据

2、修改他们的内容 假设都改为 "测试一下啦":

通过代码修改:

foreach (DataGridViewRow i in dataGridView1.Rows) {
    i.Cells[1].Value = "测试一下啦";
    i.Cells[2].Value = "测试一下啦";
    i.Cells[3].Value = "测试一下啦";
   }
   this.bookTableAdapter.Update(this.scottDataSet.book);
 

3、关闭软件再次打开查询,发现之前被选择的行并未修改成功,其它行修改成功。

解决:

1、这个问题可以直接用这个方式解决,就是不要通过代码来修改datagridview 而是修改datatable这样就不会有问题。

for(int i=0;i<datatalbe.Rows.Count;i++)

{

    datatable.Rows[i][1]="222";

    datatable.Rows[i][2]="222";

    datatable.Rows[i][3]="222";

}

 

2、这个问题自己做了几小时的测试发现了问题的原因所在:

用上面修改datatalbe的方式是没有问题的,如果你还是要用修改datagridview的方式 就会存在DataRow 的行状态不正确的问题。如果行状态为Unchanged.(未知改变) 则update是无法将这行的数据提交到数据库的。这个问题在于:你是将datatable 绑定到了datagirdview,这样一来 如果在datagridview中某行被选中,则会触发内部事件造成datatable中相应的数据行的状态被置为Unchanged,所以无论你在update前选择了哪行,被选中的那行的状态总是Unchanged,所以不能被update到数据库的!(这里的原因可能是:当datagridview与datatable绑定的时候,编译器会认为datagridview中被选中的行是用户正要编辑的行,所以会触发事件将datatable中相应的行的状态RowState 暂时置为Unchanged,你一但选择了其它行,那么编译器就会自动通过触发相应事件事判断这行是否被用户修改过了,如果修改过则RowState被置为Modify,这时才会被update到数据库中。当然还有几种其它状态 像added deleted)

知道了问题所在,就有办法来解决:

经过试验,无法直接改变行的状态属性,因为它是只读的(但可以通过方法如dt.Rows[i].SetAdded来改变行的状态),也无法通过datagridview.ClearSelection()方法或是其它在代码中直接改变选中行的方式来触发datatable中的行状态的改变。我们可以在update前,通过使用datarow.EndEdit()的方法退出行编辑的方式来达到触发行状态改变的目的(这个方法可以让编译器自动判断行的状态而不用手动去判断设置行状态)。

为了达到无论选择了哪行都能成功地将改变的值update回数据库,可以用循环对datatable中的行执行EndEdit()方法来完美解决这个问题!

如:

for (int i = 0; i < dt.Rows.Count; i++)

                {

                    dt.Rows[i].EndEdit();

                }

这样就没有问题了。

这个问题不知是不是微软的一个小BUG。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/13300.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

真题详解(UML部署图)-软件设计(五十二)

真题详解&#xff08;地址索引&#xff09;-软件设计&#xff08;五十一)https://blog.csdn.net/ke1ying/article/details/130211684 瀑布模式&#xff1a;适应 开发大型项目&#xff0c;且需求明确。 演化模式&#xff1a;适应 对软件需求缺乏准确认知。 螺旋模式&#xff…

【linux】yum “应用商店” 的基本用法

好多工具 yum软件包查看软件包安装软件卸载软件 yum 通俗的讲&#xff0c;这就似我们手机上的应用商店&#xff0c;只不过是在linux下的。 我们可以用yum来下载东西。 软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 但是这样…

19 calloc 和 realloc 虚拟内存分配的调试

前言 前面提到了 malloc 虚拟内存分配相关的内容 malloc 虚拟内存分配的调试(1) malloc 虚拟内存分配的调试(2) 这里提 calloc 和 realloc, 这两个函数 虽然没有 malloc 使用频率那么高 但是 还是有很大的知名度的, 本文这里 我们来看一下 calloc 此函数传入两个参数, 第…

Obsidian中如何创作思维导图Mind-map

使用插件 obsidian-mind-map 1.直接在社区下载安装 设置快捷键或者在左侧竖形打开命令面板搜索关键字“mind”&#xff0c; 或者为了便于使用&#xff0c;设置快捷键&#xff0c;在设置-第三方插件中-选择快捷键 然后按下你想设置的快捷键就可以 我这里设置成了CtrlAltM ,M是…

虚拟数字人的3种驱动方式

虚拟数字人是由计算机程序所构建的具有人类特征的虚拟实体&#xff0c;目前的虚拟数字人经过了三代的更迭&#xff0c;划分每一代更迭的标准则是虚拟数字人的驱动方式。 一、虚拟数字人1.0&#xff1a;动画&CG驱动 虚拟数字人1.0就是目前我们所熟知的&#xff0c;比如&am…

LiveCharts2 初步认识

文章目录 1 LiveCharts2 是什么&#xff1f;2 LiveCharts2 可以做什么&#xff1f;3 简单使用LiveCharts2 &#xff0c;实现动态曲线图 1 LiveCharts2 是什么&#xff1f; GitHub&#xff1a;https://github.com/beto-rodriguez/LiveCharts2 官网&#xff1a; https://lvchar…

C++ STL学习之【反向迭代器】

✨个人主页&#xff1a; 夜 默 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言&a…

分布式锁-Redisson

分布式锁 1、分布式锁1.1 本地锁的局限性1.1.1 测试代码1.1.2 使用ab工具测试(单节点)1.1.3 本地锁问题演示(集群情况) 1.2 分布式锁实现的解决方案1.3 使用Redis实现分布式锁(了解即可)1.3.1 编写代码1.3.2 压测 1.4 使用Redisson解决分布式锁1.4.1 实现代码1.4.1 压测1.4.2 可…

2 常见模块库(2)

2.5 复用器与分路器模块 Mux是一种用于将多个信号组合成一个信号的模块。Mux模块的名称来源于多路复用器&#xff08;Multiplexer&#xff09;。 使用Mux可以将多个输入信号组合成一个向量或矩阵&#xff0c;以便在模型中传递和处理。Mux模块可以接受任意数量的输入信号&#x…

什么是伪原创?SEO伪原创该怎么做

伪原创是指在原有的文章或内容基础上进行修改或调整&#xff0c;以产生看起来是全新内容的文章&#xff0c;但实际上并没有创造新的价值。多数情况下&#xff0c;伪原创的目的是为了在文章相对原创的情况下&#xff0c;提高搜索引擎的排名。 一、高质量伪原创 做好伪原创&#…

C语言从入门到精通第8天(分支结构if、else、switch的使用)

分支结构if、else、switch的使用 if语句if...else语句if...else嵌套if...else if...else语句switch语句 if语句 语法&#xff1a; if(表达式){ 语句&#xff1b; } 如果表达式为真&#xff0c;则执行{}里面的语句。如果为假&#xff0c;则不执行。示例代码&#xff1a; int m…

翻译国外文章-整篇文章的翻译

chatgpt翻译是专业的吗 ChatGPT是一种AI语言模型&#xff0c;它可以用来执行各种自然语言处理任务&#xff0c;包括翻译。然而&#xff0c;ChatGPT的翻译结果并不是专业的翻译&#xff0c;因为该模型并不是专为翻译任务训练的。 虽然ChatGPT的翻译质量相对较高&#xff0c;但…

全景视角下的世界探索——三维全景地图

引言&#xff1a;随着数字技术和虚拟现实技术的发展&#xff0c;三维全景地图已成为一种新型地图展示方式&#xff0c;深受人们的关注和喜爱。三维全景地图以其真实逼真、互动性强、展示效果好等特点&#xff0c;正在越来越多的领域得到应用。 三维全景地图的特点 1.真实逼真 …

考研计算机组成原理总结(7)

一.虚拟存储器 1.基本知识 主存和辅存共同构成了虚拟存储器&#xff0c;二者在硬件和系统软件的共同管理下工作。对于应用程序员而言&#xff0c;虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。 2.基本概念 虚拟存储器将主存或辅存的地址空间统一编址&#x…

Excel中的表格批量生成word表格

场景&#xff1a;测试用例excel转word 我们在项目中&#xff0c;默认情况下是用我们的excel用例模版输出测试用例。但是有的项目中&#xff0c;会要求在word版本的测试计划或者测试报告中&#xff0c;写明测试用例。而我们的测试用例&#xff0c;有的项目有上千条&#xff0c;…

ChatGPT常见问题,Access denied的解决办法

今天&#xff0c;突然想登录一登录ChatGPT&#xff0c;提示 Access denied, You do not have access to chat.openai.com 怎么办&#xff1f; “Access denied You do not have access to chat.openai.com. The site owner may have set restrictions that prevent you from ac…

基于html+css的图片展示15

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

1026. 节点与其祖先之间的最大差值(4-19日

题目&#xff1a;给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么…

2023年网络安全比赛--Windows渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.通过本地PC中渗透测试平台Kali对服务器场景20221219win进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Flag值(例如3.1.4500)提交; 2.通过本地PC中渗透测试平台Kali对服务器场景202212…

车身控制模块BCM(Body Control Module)

1.BCM概述 车身控制模块BCM是高集成度的芯片。BCM的英文全称是Body Control Module。其控制对象是采用高灵敏度带唤醒及睡眠检测的高频收发器&#xff0c;实现车门车窗遥控上锁与开锁、电动后视镜、中控门锁、玻璃升降装置、车灯(远光灯、近光灯、位置灯、制动灯、转向灯、雾灯…