4

我有一个 DataGridView (WinForms),我在其中定义了一个从 DataGridViewTextBoxEditingControl 派生的自定义 EditingControl,它只允许数字字符。

每次用户按键时,我都需要在 DataGridView 上引发 CellValueChanged 事件,但默认行为是仅在编辑完成时引发事件。

每次按下键时如何引发事件?

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
            RaiseDataGridViewCellValueChanged(); // <-- Any way?
    }
}

更新:

我找到了一种解决方法,但我不确定这是一个好的解决方案:

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
        {
            EditingControlDataGridView.EndEdit();
            EditingControlDataGridView.BeginEdit(false);
        }
    }
}
4

1 回答 1

1

这里的目标是什么?您似乎正在尝试创建一个键盘掩码,其中任何非确认字符都会引发警报?如果是这样,您可能会通过添加 MaskedTextBoxColumn 在 DataGridView 中找到快乐。MaskedTextBoxColumn 以比强制编辑提交更合理的方式控制输入。

请参阅此处了解如何使用它的代码:http: //msdn.microsoft.com/en-us/library/ms180996.aspx

根据您在评论中更新的标准,听起来您的解决方案可能与它所能获得的一样好。但是要意识到,当您有其他控件根据键盘事件更新到另一个控件时,容易进入无限事件循环。您可能最好在表单上拥有一个处理所有事件的委托,因为它可以通过丢弃基于状态的虚假事件来防止事件触发器的无限循环。

实际上,这将使用 Model View Presenter 模式,您的委托充当演示者并管理您的视图(您的 UI)上的流量。

这样做,您甚至可以将 Presenter 逻辑移动到一个新类中,然后将数据绑定到该类中,从而允许您从一个逻辑结构而不是事件处理程序的大杂烩中完全控制 UI。

于 2008-10-23T18:25:59.213 回答