如何处理试图清除表单时触发的控制事件
本文关键字:表单 事件 控制 清除 何处理 处理 | 更新日期: 2023-09-27 17:59:23
我正在寻找一种在提交数据后清除winform的有效方法。目前,我使用一种静态方法,它接受一个控件作为参数,然后在控件中循环,确定控件的类型,然后清除控件的内容。它运行得很好,但我遇到的问题是控制事件。当我清除控件时,控件事件会触发,并且由于事件中存在数据类型转换(例如int.Parse),它会导致错误,因为一旦清除控件,控件事件就会触发,并将一个空字符串传递给int.Parse。除了在控件的事件中使用一堆if语句或int.TryParse来防止数据转换发生外,有没有更好的方法可以清除控件而不在过程中触发它的事件?
感谢
以下是我的控制事件和清除方法的示例:
private void Quantity_TextChanged(object sender, EventArgs e)
{
presenter.Quantity = int.Parse(Quantity.Text);
}
public static void ClearForm(Control.ControlCollection controls)
{
foreach (Control ctrl in controls)
{
if (ctrl.GetType() == typeof(TextBox))
{
((TextBox)ctrl).Text = "";
}
if (ctrl.GetType() == typeof(ComboBox))
{
((ComboBox)ctrl).SelectedIndex = 0;
}
if (ctrl.GetType() == typeof(DateTimePicker))
{
DateTimePicker datePicker = ctrl as DateTimePicker;
//datePicker.Format = DateTimePickerFormat.Custom;
datePicker.CustomFormat = "dd-MMM-yyyy";
datePicker.Value = DateTime.Today;
}
if (ctrl.HasChildren)
{
ClearForm(ctrl.Controls);
}
}
}
解决方案1:在清除内容之前,您只需要Unwire
订阅控件的EventHandlers
清除EventHandlers
后将其接线返回。
解决方案2:
如果整数是EMPTY
,您可以在解析整数之前从函数返回,如下所示:
private void Quantity_TextChanged(object sender, EventArgs e)
{
if(String.IsNullOrWhiteSpace(Quantity.Text))
return;
presenter.Quantity = int.Parse(Quantity.Text);
}
解决方案3:为了避免无效或EMPTY
值出现任何异常,您可以使用以下int.TryParse()
方法:
来自MSDN:int.TryParse()
将数字的字符串表示形式转换为其32位带符号的整数等价。返回值指示转换是否成功。
private void Quantity_TextChanged(object sender, EventArgs e)
{
int quantity;
if(int.TryParse(Quantity.Text,out quantity))
presenter.Quantity = quantity.ToString();
}
虽然使用您所描述的解决方案很诱人,但您确实需要保护您的输入,否则当用户做了意外的事情时,您将抛出异常。我会回到你的事件处理程序,要么像你所说的那样防范",要么使用锥虫
第一个答案中提到的另一个选项是使用两个方法,一个取消挂起所有事件,另一个将它们挂起。您将对Clear的调用与这些调用放在一起
UnHook()
Clear()
ReHook()
这将处理您想要做的事情,但您必须在两个地方手动保持事件代码的最新状态
我认为最好的解决方案是只选通事件中的输入错误。