我正在寻找一种在提交数据后清除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);
}
}
}
答案 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();
这将处理您想要做的事情,但是您必须在两个地方手动更新事件代码。
我认为最好的解决方案是在事件中输入输入错误。