【问题标题】:DataGridView RowValidating fires after selecting another control. Any workaround?DataGridView RowValidating 在选择另一个控件后触发。任何解决方法?
【发布时间】:2011-08-15 20:14:15
【问题描述】:

使用 RowValidating 事件可以正常工作。

但是,如果我单击 datagridview 中的某个位置而不更改行,则在选择另一个控件后总是会触发该事件。

示例 1(正确):

选择一行 -> 选择一个文本框 -> 选择另一行 |->RowValidating 提出

示例 2(不正确):

选择一行 -> 单击列标题 -> 选择文本框 -> 选择另一行 |->RowValidating 引发 |->RowValidating 引发

示例 3(不正确):

选择一行 -> 单击空白区域 -> 选择一个文本框 -> 选择另一行 |->RowValidating 引发 |->RowValidating 引发

有没有办法只在一行真正改变之前获取 RowInvalidating?

我已经尝试覆盖 SetSelectedRowCore 并且能够取消选择更改,但 datagridview 在触发 SetSelectedRowCore 之前将 EndEdit() 发送到绑定。

【问题讨论】:

    标签: c# .net winforms datagridview


    【解决方案1】:

    我发现了一些肮脏的解决方法:

        private void dataGridView_RowValidating(object sender, DataGridViewCellCancelEventArgs e) {
            Point pos = dataGridView.PointToClient(Control.MousePosition);
            DataGridView.HitTestInfo hi = dataGridView.HitTest(pos.X, pos.Y);
            if (hi.Type == DataGridViewHitTestType.Cell && hi.RowIndex != e.RowIndex) {
                e.Cancel = !AllowChangeCurrent(); //Check if changing selection is allowed
            }
        }
    

    首先我在 DataGridView 中获取当前鼠标位置。

    然后我检查是否单击了单元格。 (假 -> 完成)

    至少我检查单击的单元格/行是否不是当前的(False -> Finished | True -> Validate)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-01-30
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多