2

我有DataGridView一个自定义的DataGridViewColumn. 该列托管第三方组件。我在单元格中进入编辑模式并修改其值,然后按 Enter 键验证该值。问题是我必须按两次 Enter 键才能验证该值。似乎第一个输入键是验证单元格中托管的第三方编辑器中的值,第二个是DataGridView验证单元格的值......那么如何只按一次输入键验证单元格的值?

我还看到了奇怪的行为,例如,最后DataGridView一行的行为与DataGridView's 单元格的其余部分不同。对于最后一行,如果我编辑一个单元格的值,然后按 Enter 键进行验证,在验证值之后,它始终保持在同一个单元格中并处于编辑模式,并且单元格的值被选中,因此用户可以认为单元格值无效时事实上不是。其余行不会发生这种情况。他们需要按两次回车键进行验证,并且单元格在验证后不会保持在编辑模式。

编辑:关于需要按两次回车键:在自定义单元格中,当第一次按下回车键时,它会引发表示单元格值已更改的事件,在这种情况下,OnSourceValueChanged(这是当值发生变化时为第三方引发的事件)所以我这样做:

        this.valueChanged = true;
        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
        base.OnSourceValueChanged(e);

执行 NotifyCurrentCellDirty 时,它会在 datagridview 上引发 CurrentCellDirtyStateChanged,代码为:

            if (this.gridView.IsCurrentCellDirty)
        {
            this.gridView.CurrentCell.DataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
            this.gridView.EndEdit(DataGridViewDataErrorContexts.Commit);
        }

之后,为 datagridview 引发 DataError 事件,但单元格继续处于编辑模式,所以我想提交值并退出编辑模式。这个怎么做?我也试过:

this.dataGridView.CurrentCell.DataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);

this.dataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);

在 DataError 处理程序中,但它不起作用。

最后, cellvaluechanged 可能没有被提升,因为它是单元格中的托管控件......我不明白为什么我必须按两次 Enter 键才能提交和验证单元格上的更改并退出单元格的编辑模式。我只想按回车键一次。

可能原因是在 CurrentCellDirtyStateChanged 中提交后发生错误。引发 DataError 事件,报告提交错误。另外,如何避免提交错误?怎么了?

4

1 回答 1

0

您可以在 CellValueChanged 事件中实现您的单元格验证逻辑。一旦单元格的值被编辑,该事件将被触发。

于 2012-11-07T11:24:34.563 回答