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

obb*_*rus 0 c# events winforms

我正在寻找一种有效的方法来在提交数据后清除我的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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sud*_*udi 5

解决方法1:你只需要UnwireEventHandlers预订的控制清除内容之前

EventHandlers清理后将背面接线.

解决方案2:

你可以在解析整数之前从函数返回,如果它是EMPTY:

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

    presenter.Quantity = int.Parse(Quantity.Text);
}
Run Code Online (Sandbox Code Playgroud)

解决方案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();
}
Run Code Online (Sandbox Code Playgroud)