【问题标题】:Raise CellValueChanged from a custom editing control in a DataGridView从 DataGridView 中的自定义编辑控件引发 CellValueChanged
【发布时间】:2008-10-21 11:17:43
【问题描述】:

我有一个 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);
        }
    }
}

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我正在尝试检测单元格文本何时发生更改,而无需等待焦点离开单元格。
    • 我想我应该改写一下:如果您尝试检测单元格更改,响应 OnKeyPress 之类的事件就可以了。我的意思是......也许你应该使用一个控件设计来屏蔽输入到数字本质上。
    • 我同意这一点,但真正的问题是我需要在用户按下一个键后立即更新屏幕中的其他控件(即重新计算标签中显示的一些总数)
    • OK:“只允许数字字符”部分是红鲱鱼。除非您有一些非常不寻常的设计要求,否则在数据网格中进行实时更新听起来是一个非常的坏主意:失去了退出编辑的能力。
    • 想多了,我相信你可能想看看模型视图演示者模式。更多内容在编辑后的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多