C# GridDataView Cell验证问题

Anod 2013-08-08 05:41:56
有一个GridDataView,其Cell允许手动输入数据,对该数据要进行有效性验证.

在GridDataView所在界面有几个按钮,Delete,Reset,OK,Cancel.

现在的问题是在输入数据尚未改变CurrentCell进行验证时,点击上述几个Button.
希望实现以下效果:
1.如果点击Delete,可以删除CurrentCell所在行,不管数据是否有效.
2.如果点击Reset,可以清空GridDataView,不管数据是否有效.
3.如果点击OK,则验证输入数据,如果有效则记录GirdDataView中数据,如果无效则提示数据无效,且不记录数据.
4.如果点击Cancel,则可以设置GridDataView.Enable属性,不管数据是否有效.


上述Button有可能是ToolStripButton,个人在调试中发现,gridSite_CellValidating有时在点击Button时发生,有时在Button中设置CurrentCell=null时发生,这个是最让人恼火的......


求解应如果搞定.
...全文
308 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anod 2013-09-18
  • 打赏
  • 举报
回复
目前很笨的采用用一个List保存一个控件列表解决.,当控件列表内控件Selected或者Fosused等等有一个为true时,采取对用的验证或不验证操作...
Anod 2013-09-18
  • 打赏
  • 举报
回复
引用 17 楼 u011303459 的回复:
[quote=引用 6 楼 jshi123 的回复:] reset和 delete 设置属性 CausesValidation = false
6楼的方法是对的。不知道楼主怎么做的。 在dataGridView1_CellValidating事件中验证数据合法性,如果非法e.Cancel = true; 然后设定reset和 delete 设置属性 CausesValidation = false。这样点击reset和 delete是不会进入dataGridView1_CellValidating事件的。点击reset清空所有数据,点击delete删除当前行都试过没有问题。[/quote] 设置reset和 delete属性 CausesValidation = false,当点击其他按钮使得验证失败后,再点击reset或者delete就不行了.
feiniao19830822 2013-08-12
  • 打赏
  • 举报
回复
引用 6 楼 jshi123 的回复:
reset和 delete 设置属性 CausesValidation = false
6楼的方法是对的。不知道楼主怎么做的。 在dataGridView1_CellValidating事件中验证数据合法性,如果非法e.Cancel = true; 然后设定reset和 delete 设置属性 CausesValidation = false。这样点击reset和 delete是不会进入dataGridView1_CellValidating事件的。点击reset清空所有数据,点击delete删除当前行都试过没有问题。
Anod 2013-08-12
  • 打赏
  • 举报
回复
引用 14 楼 jshi123 的回复:
把验证移到DataGridView.RowValidating,单个cell出错可以不用管
还是实现不了需要的效果.
PaulyJiang 2013-08-09
  • 打赏
  • 举报
回复
验证和你的按钮没关系。Validating的时候去处理
Anod 2013-08-09
  • 打赏
  • 举报
回复
引用 8 楼 jshi123 的回复:
[quote=引用] Gets or sets a value indicating whether the control causes validation to be performed on any controls that require validation when it receives focus.
看msdn例子: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx[/quote] 额,之前记错了,实验了下,是可以不转移焦点执行Button事件,从而使得验证事件不执行,而且还可以在其中更改未提交的值.3Q.解决后结贴.
jshi123 2013-08-09
  • 打赏
  • 举报
回复
引用
Gets or sets a value indicating whether the control causes validation to be performed on any controls that require validation when it receives focus.
看msdn例子: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx
Anod 2013-08-09
  • 打赏
  • 举报
回复
引用 6 楼 jshi123 的回复:
reset和 delete 设置属性 CausesValidation = false
其属性是针对该控件的验证事件的.... 目前在想,对GridDataView设置一个免验证的控件List,当焦点所在控件在这个List时,不对数据进行验证直接填充(反正这个数据是要被删除或废弃的).当然List中的控件需要支持获取焦点.
jshi123 2013-08-09
  • 打赏
  • 举报
回复
reset和 delete 设置属性 CausesValidation = false
Anod 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 bdmh 的回复:
CellValidating是那样,不过你可以判断啊,判断e.FormattedValue和cell的value是否一致,如果一致,就e.Cancel = true,标示没有进行修改
验证过程本身没有问题,是验证的执行让人头疼. 我输入一个不合法的数据,然后不想要所有数据了,就点Reset,或者我不想要当前行了,就Delete删除当前行,但是对正常的Button来说,会执行验证,因为我输入不合法数据,导致验证失败,e.Cancel = true,所以焦点仍然在所输入的Cell,并没有执行需要的Reset或Delete操作.
bdmh 2013-08-09
  • 打赏
  • 举报
回复
CellValidating是那样,不过你可以判断啊,判断e.FormattedValue和cell的value是否一致,如果一致,就e.Cancel = true,标示没有进行修改
Anod 2013-08-09
  • 打赏
  • 举报
回复
引用 1 楼 jshi123 的回复:
把验证方法放到OK处理程序里
获取譬如有几个需要用到GridDataView中数据怎么办? 譬如画出当前行所有数据曲线图各种图之类的?总不能在此类Button里都加验证事件吧?
Anod 2013-08-09
  • 打赏
  • 举报
回复
引用 1 楼 jshi123 的回复:
把验证方法放到OK处理程序里
那么输入完一个Cell输入另一Cell呢?此时不验证? 那么如果这个GridDataView输入完了,输入的下一个GridDataView需要以此前的GridDataView数据为依据怎么办?
jshi123 2013-08-09
  • 打赏
  • 举报
回复
把验证移到DataGridView.RowValidating,单个cell出错可以不用管
Anod 2013-08-09
  • 打赏
  • 举报
回复
当输入不是数字时,验证方法会提示用户数据错误,并将e.Cancel=true; 然后就变成如上图所示,用户输入了上面的数据,点OK后提示数据错误,然后焦点就死在那里了,.. 其中Reset和Cancel的CausesValidation 属性已经设置为false,但此时点击Reset或Cancel都会先触发验证事件...从而使得不修改上面的非法输入为数字的话,焦点就死在Cell里. 我的意图是点击OK就触发验证,如果验证成功则读取Grid中的数据,点击ReSet就清除Grid中的数据,点击Cancel就关闭对话框.
poloyzhang 2013-08-09
  • 打赏
  • 举报
回复


简单和自定义数据验证

简单数据验证

            this.dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dataGridView1_DataError);


   private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.ThrowException = false;

        }

自定义数据验证
DataGridView.CellValidating 事件,在单元格失去输入焦点时发生,并启用内容验证功能。

        private void dataGridView1_CellValidating(object sender,    DataGridViewCellValidatingEventArgs e)
        {
            dataGridView1.Rows[e.RowIndex].ErrorText = "";
            int newInteger;

            // Don't try to validate the 'new row' until finished 
            // editing since there
            // is not any point in validating its initial value.
            if (dataGridView1.Rows[e.RowIndex].IsNewRow) { return; }
            if (!int.TryParse(e.FormattedValue.ToString(),
                out newInteger) || newInteger < 0)
            {
                e.Cancel = true;
                dataGridView1.Rows[e.RowIndex].ErrorText = "the value must be a non-negative integer";
            }
        }

DataGridView.VirtualMode 属性
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview.virtualmode(v=vs.80).aspx


Anod 2013-08-09
  • 打赏
  • 举报
回复


如图,当验证结果失败一次之后, 如果不修正输入的数据,焦点就跳不出来了,CausesValidation = false也无用....
jshi123 2013-08-08
  • 打赏
  • 举报
回复
把验证方法放到OK处理程序里

110,534

社区成员

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

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

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