datagridview中CellValidating中出现无限循环了,不知怎么办?

YangYun 2012-05-05 10:54:48
今天我用DataGridView做了一个测试,本意是验证用户在单元格的输入,不符要求就给出提示,符合要求就跳到另一个单元格中,可是却出现死循环。
我的DataGridView1_CellValidating代码如下:
int row = e.RowIndex;
int col = e.ColumnIndex;
if (col==1) //这里我只对第二列进行操作
{
switch (row )
{
case 0:
if (String.IsNullOrEmpty(e.FormattedValue.ToString()))
{
MessageBox.Show("不能输入空值");
e.Cancel = true; //返回重输。
}
else //问题就出在下面。
{
e.Cancel = false; //这一句刚开始没加,后来加上也不行。
dataGridView1.CurrentCell = dataGridView1.Rows[row + 2].Cells[col];
//我单步调试时发现,执行上一句后,程序马上就又进入了这个CellVadating中执行。但这个row和col依然没变化。有什么办法跳出循环呢?
}
break;
case 2:
if (e.FormattedValue.ToString() != "123")
{
MessageBox.Show("can not 123");
e.Cancel = true;
}
else
dataGridView1.CurrentCell = dataGridView1.Rows[row + 2].Cells[col];
break;

}

所有现象和问题都已经在前面了,有什么办法跳出这个CellVadating循环呢?
...全文
485 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xky96 2012-05-06
  • 打赏
  • 举报
回复
好像不对吧,我说的是触发关闭的控件:按钮、Form等...

可以直接在窗体加载之前设置它们的CauseValidating
YangYun 2012-05-06
  • 打赏
  • 举报
回复
将这个datagridView.CauseValidating=false,这一句是正解,有了它,果然正确了
YangYun 2012-05-06
  • 打赏
  • 举报
回复
现在又发现一个问题,我在CellVadating里执行了验证。但我在执行“继续录入下一份”时(我这里主要用DataGridview来执行录入一份份的问卷,录入时进行一些检验,录完一份后可以继续录入下一份),如果我在录入半途时突然要停下来不想录入了,废弃这次录入想转到另外的窗口页面,消除这个窗口时,程序就开始提示这里那里没通过验证了(因为我没有录完,但这时验证继续在发生作用),这时我该怎么办呢?才能让它停止验证???
xky96 2012-05-06
  • 打赏
  • 举报
回复
Validating只进行验证,
在Validated中是可以进行验证后操作的,
至于你的代码没有实现意图,那是跳转代码的问题。
尝试下单步跟踪。

要使按钮强制终止数据控件的验证,只需做如下设置:
按钮的CausesValidation属性设为false
如果仍然验证,检查按钮的容器(如Panel)的CausesValidation属性。
YangYun 2012-05-06
  • 打赏
  • 举报
回复
结果不行
YangYun 2012-05-05
  • 打赏
  • 举报
回复
确实是在CellValidating里使用CurrentCell改变单元格的话,又会马上触发CellValidating事件。因此这就造成了死循环。
但如果我想实现在CellValidating验证成功后,直接跳到另外一个单元格,这个功能该怎样实现呢?

我在验证后加了datagridview.EndEdit()也不行啊
orochiheart 2012-05-05
  • 打赏
  • 举报
回复
try
http://blog.csdn.net/fanweiwei/article/details/1866199
http://www.cnblogs.com/plmnko/archive/2010/09/14/1826352.html
http://blog.163.com/wangpan2010@126/blog/static/5896027820112934428294/
orochiheart 2012-05-05
  • 打赏
  • 举报
回复
try
http://hi.baidu.com/fxb_hyb/blog/item/40a2717b206049fc0ad187cc.html
http://blog.csdn.net/fanweiwei/article/details/1866199
http://www.cnblogs.com/plmnko/archive/2010/09/14/1826352.html
http://ddkangfu.blog.51cto.com/311989/97156
orochiheart 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
dataGridView1.CurrentCell改变了,会触发数据验证
[/Quote]
+1 应该是这个原因导致的
YangYun 2012-05-05
  • 打赏
  • 举报
回复
期盼高人们的关注和回复啊
YangYun 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
dataGridView1.CurrentCell改变了,会触发数据验证
[/Quote]
那我该 怎样实现一旦验证成功,就自动跳到另外一个单元格呢?
YangYun 2012-05-05
  • 打赏
  • 举报
回复
我刚开始准备在CellEndEdit中进行验证,后来发现,当你自动跳到某个单元格后,不进行任何操作,马上按Enter键离开此单元格,CellEndEdit事件就不会发生,因此我就用CellValidating来验证,但验证成功后不能跳到另外一个单元格
bdmh 2012-05-05
  • 打赏
  • 举报
回复
dataGridView1.CurrentCell改变了,会触发数据验证
YangYun 2012-05-05
  • 打赏
  • 举报
回复
我的本意是验证某个单元格的输入,一旦输入满足要求,则直接跳到另一个单元格中。
xky96 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
引用 11 楼 的回复:
这里的后续处理,指的是验证通过后的处理

那意思是我可以不在CellValidating里处理,而可以在CellValidated里处理了哟
[/Quote]

当然。

可以这样理解:
CellValidating 准备验证
CellValidated 验证通过
YangYun 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
这里的后续处理,指的是验证通过后的处理
[/Quote]
那意思是我可以不在CellValidating里处理,而可以在CellValidated里处理了哟
xky96 2012-05-05
  • 打赏
  • 举报
回复
这里的后续处理,指的是验证通过后的处理
xky96 2012-05-05
  • 打赏
  • 举报
回复
cellValidating只负责验证,验证失败则e.Cancel=true;
至于后续处理,包括跳转可以交给cellValidated

110,986

社区成员

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

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

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