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

时间:2014-04-21 15:46:05

标签: c# winforms events

我正在寻找一种在提交数据后清除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);
            }
        }
    }

2 个答案:

答案 0 :(得分:5)

解决方案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();
}

答案 1 :(得分:1)

虽然使用您所描述的解决方案很诱人,但您确实需要保护您的输入,否则当用户执行意外操作时您将抛出异常。我会回到你的事件处理程序,要么警惕“”,要么使用tryparse,如你所述。
第一个答案提到的另一个选择是有几个方法,一个解开你所有的事件,另一个将它们挂起来。您通过这些呼叫将您的呼叫括在Clear中UnHook();
清除();
ReHook();
这将处理您想要做的事情,但是您必须在两个地方手动更新事件代码。
我认为最好的解决方案是在事件中输入输入错误。