C# 如何处理试图清除窗体时触发的控件事件

C# 如何处理试图清除窗体时触发的控件事件,c#,winforms,events,C#,Winforms,Events,我正在寻找一种在提交数据后清除winform的有效方法。目前我使用一种静态方法,它接受一个控件作为参数,然后在控件之间循环,确定控件的类型,然后清除控件的内容。它工作得很好,但我遇到的问题是控制事件。清除控件时,会触发控件事件,并且由于事件(例如int.Parse)中存在数据类型转换,因此会导致错误,因为一旦清除控件,就会触发控件事件并将空字符串传递给int.Parse。除了在控件的事件中使用一堆if语句或int.TryParse来防止发生数据转换之外,还有更好的方法来清除控件,而不触发进程中的

我正在寻找一种在提交数据后清除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:在清除内容之前,只需
取消
订阅控件的
事件处理程序

清除
EventHandlers
后,将其连接回

解决方案2:

如果整数
为空
如下所示,您可以在解析整数之前从函数返回:

private void Quantity_TextChanged(object sender, EventArgs e)
{
    if(String.IsNullOrWhiteSpace(Quantity.Text))
        return;

    presenter.Quantity = int.Parse(Quantity.Text);
}
解决方案3:为避免无效或
空值出现任何异常,您可以使用
int.TryParse()
方法,如下所示:

来自MSDN:
int.TryParse()

将数字的字符串表示形式转换为其32位有符号 整数等价。返回值指示转换是否成功 成功了


解决方案1:在清除内容之前,只需
取消
订阅控件的
事件处理程序

清除
EventHandlers
后,将其连接回

解决方案2:

如果整数
为空
如下所示,您可以在解析整数之前从函数返回:

private void Quantity_TextChanged(object sender, EventArgs e)
{
    if(String.IsNullOrWhiteSpace(Quantity.Text))
        return;

    presenter.Quantity = int.Parse(Quantity.Text);
}
解决方案3:为避免无效或
空值出现任何异常,您可以使用
int.TryParse()
方法,如下所示:

来自MSDN:
int.TryParse()

将数字的字符串表示形式转换为其32位有符号 整数等价。返回值指示转换是否成功 成功了


虽然使用您描述的解决方案很有诱惑力,但您确实需要保护您的输入,否则当用户做了意外的事情时,您将抛出异常。我会回到您的事件处理程序,或者像您所说的那样,防止“”或使用tryparse。
第一个答案中提到的另一个选项是使用两个方法,一个方法将所有事件解钩,另一个方法将它们挂起。您将要清除的调用括在那些调用中
UnHook()
清除()
ReHook()
这将处理您想要做的事情,但您必须在两个地方手动更新事件代码
我认为最好的解决方案是在事件中关闭输入错误。

虽然使用您描述的解决方案很有诱惑力,但您确实需要保护您的输入,否则当用户做出意外行为时,您将抛出异常。我会回到您的事件处理程序,或者像您所说的那样,防止“”或使用tryparse。
第一个答案中提到的另一个选项是使用两个方法,一个方法将所有事件解钩,另一个方法将它们挂起。您将要清除的调用括在那些调用中
UnHook()
清除()
ReHook()
这将处理您想要做的事情,但您必须在两个地方手动更新事件代码
我认为最好的解决方案是在事件中屏蔽输入错误。

要清楚,检查
Quantity.Text
是否有值,使用
int.TryParse()
将是正确的方法。希望你的问题只是学术性的。解决方案4:使用适当的技术(WPF),永远忘记所有这些可怕的winforms黑客。您所有的“清除表单”代码都可以替换为一个
DataContext=new MyDataObject()在WPF中。为了清楚起见,检查
Quantity.Text
是否有值,使用
int.TryParse()
将是正确的方法。希望你的问题只是学术性的。解决方案4:使用适当的技术(WPF),永远忘记所有这些可怕的winforms黑客。您所有的“清除表单”代码都可以替换为一个
DataContext=new MyDataObject()在WPF中。