DataGridView控件数据修改问题

内存泄漏 2011-02-23 04:55:20
最近在做一个c/s数据库系统,用到了DataGridView控件,我是把他绑定到了DataSet中的一个表中,修改、添加、删除操作都在DataGridView控件中完成,然后在保存按钮中Update到数据库。但DataGridView控件在修改数据时有个奇怪的问题,那就是如果我修改了某个单元格的值,这时候如果我按tab键,再点保存,DataSet居然会认会这条记录没有修改,除非是按回车,才会认会修改了,不知道大家有没有遇见过这种问题,怎么解决啊?晕。。
...全文
218 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
内存泄漏 2011-02-24
  • 打赏
  • 举报
回复
搞定了,是EndEdit的问题,有很多对象有这个方法,没选对。晕
wuyq11 2011-02-23
  • 打赏
  • 举报
回复
上Tab/Enter在消息预处理的时候就被处理了,起到上下导航或关闭编辑控件等作用
class DGV : DataGridView
{
protected override bool ProcessKeyPreview(ref Message m)
{
if (this.EditingControl is DataGridViewTextBoxEditingControl)
{
KeyEventArgs e = new KeyEventArgs(((Keys)((int)m.WParam)) | Control.ModifierKeys);
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
{
return false;
}
}
return base.ProcessKeyPreview(ref m);
}
}
  • 打赏
  • 举报
回复
帮楼主试了一下, 按Tab键可以起到和Enter键相同的效果:
1,结束编辑状态
2,将DataGridView的已修改的Row关联到DataTable的对应Row
3,设置DataTable的对应Row的RowState

提醒楼主,千万不要调用DataTable的EndEdit()函数,那个函数有个功能是将所有行的RowState改为UnChanged,即使已经修改过的数据并没有保存到数据库
内存泄漏 2011-02-23
  • 打赏
  • 举报
回复
调试了一下程序,发现按了tab后,该字段的值已经更新到DataSet中了,但主要是RowState没有改,还是UnChanged。所以导致更新数据库失败,只有切换到其它列时RowState才会被改为Modified。 有没有办法用程序改变这个值啊,好像是只读属性。。郁闷。。。
内存泄漏 2011-02-23
  • 打赏
  • 举报
回复
还是不行啊,虽然CellValueChanged事件是在tab后触发了,但是执行了EndEdit没用。修改没有写回DataSet。。有没有别的函数能将修改同步回DataSet的呢?
GameWong 2011-02-23
  • 打赏
  • 举报
回复
在CellValueChange事件中写上【EndEdit的代码】
试试。
内存泄漏 2011-02-23
  • 打赏
  • 举报
回复
我就是不想自己修改DataSet中的数据啊,既然已经把DataGridView与DataView绑定了,当然想让它自动完成数据的更新,在我编辑完后,自动更新到DataSet,如果我按回车,是可以更新的,就是按Tab不行。。但实际操作中,会经常按Tab切换输入单元格的。
GameWong 2011-02-23
  • 打赏
  • 举报
回复
CellValueChange事件中,执行修改dataset数据。
试试。
内存泄漏 2011-02-23
  • 打赏
  • 举报
回复
我在保存按钮里面写了EndEdit的代码,但是没用。
  • 打赏
  • 举报
回复
在按钮事件中判断如果按下的是Tab键就调用EndEdit函数,实际上表格控件单元格在编辑状态按下按Enter键时,会自动调用EndEdit()结束编辑状态,此时表格控件的修改内容才反映到DataSet的Table中

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧