gpt4 book ai didi

c# - 从 DataGridView 中的自定义编辑控件引发 CellValueChanged

转载 作者:行者123 更新时间:2023-11-30 12:54:11 25 4
gpt4 key购买 nike

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

最佳答案

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

请在此处查看显示如何使用它的代码:http://msdn.microsoft.com/en-us/library/ms180996.aspx

根据您在评论中更新的标准,听起来您的解决方案可能已经达到了最佳状态。但是请注意,当您让其他控件根据键盘事件在另一个控件上更新时,非常很容易陷入无限事件循环。您可能最好在处理所有事件的表单上拥有一个委托(delegate),因为它可以通过丢弃基于状态的虚假事件来防止事件触发器的无限循环。

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

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

关于c# - 从 DataGridView 中的自定义编辑控件引发 CellValueChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/221490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com