我正在使用
Windows窗体项目中的DataGridViews.
我想获得类似于在MS sql Server Management Studio中以编辑模式添加的内容.
我想获得类似于在MS sql Server Management Studio中以编辑模式添加的内容.
我试着解释一下:我的数据网格中有一些必需的列,我想只有当这些列中的值有效时才会在网格中添加一行.
如果单元格的值无效,我想用消息框警告用户并按ESC,应该重置不正确的行.
我尝试使用CellValidating和RowValidating事件,但我对结果不满意.
你能帮助我吗?
UPDATE
我用这种方式实现了RowValidating:
private void myGrid_RowValidating(object sender,DataGridViewCellCancelEventArgs e) { if (string.IsNullOrEmpty(myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].FormattedValue.ToString())) { e.Cancel = true; myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].ErrorText = "Mandatory"; MessageBox.Show("Error message"); } else { myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].ErrorText = string.Empty; } }
当必填字段中的值无效时,将显示消息框并且单元格为红点,但按ESC键我获取IndexOutOfRangeException …
只有当我显示消息框时,才会抛出异常,对方法的工作进行评论(但这不是我想要实现的行为……)
解决方法
以下MSDN论坛帖子中解释了此问题:
DataGridView + RowValidating = Index 4 does not have a value?
DataGridView + RowValidating = Index 4 does not have a value?
基本上,它似乎是DataGridView处理验证的方式中的一个错误(或至少非常意外的行为) – MessageBox.Show()导致对不再存在的行进行验证.
我发现您的代码的以下更改修复了该问题:
private void myGrid_RowValidating(object sender,DataGridViewCellCancelEventArgs e) { // Note the check to see if the current row is dirty if (string.IsNullOrEmpty(myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].FormattedValue.ToString()) && myGrid.IsCurrentRowDirty) { e.Cancel = true; myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].ErrorText = "Mandatory"; MessageBox.Show("Error message"); } else { myGrid.Rows[e.RowIndex].Cells["MandatoryColumn"].ErrorText = string.Empty; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。