如何处理试图清除表单时触发的控制事件

本文关键字:表单 事件 控制 清除 何处理 处理 | 更新日期: 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()
这将处理您想要做的事情,但您必须在两个地方手动保持事件代码的最新状态
我认为最好的解决方案是只选通事件中的输入错误。