我尝试做一些格式化,我的格式化结果工作正常。问题是它是Textbox LostFocus和GotFocus事件的循环。所以在调试过程中它会相互跳跃,我不知道我做错了什么。
NUMBERS的转换工作正常,它只是循环。因此,当我在文本框上单击鼠标时,它会启动:txtBase2
它进入txtBase2_GotFocus事件第8行
然后执行第9行
然后跳转到txtBase2_Lostfocus方法到第3行
然后再回到txtBase2_GotFocus方法到lin8。
以上4个步骤仍在循环中......并且它不会停止 我究竟做错了什么?或者我没看到的是什么?
ps:转换是为金额值完成的。
整个想法是:
当用户在文本框中键入数量并且他离开文本框时,它的格式应为:1.245,12(千位分隔符)
当用户离开文本框并且有金额/数字时,文本框编号应格式化为1245,12(没有千位分隔符)
格式化工作的转换很精细但是它已经在这两个事件中循环!!!!!!
winforms,C#,. NET 4.5
请咨询?
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
txtBase2.LostFocus += txtBase2_LostFocus;
txtBase2.GotFocus += txtBase2_GotFocus;
}
private void txtBase2_LostFocus(object sender, EventArgs e)
{
Line 1:/ /when leaving the TEXTBOX
Line 2: //input: 1234,56
Line 3: double toDouble = Convert.ToDouble(txtBase2.Text);
Line 4: string jj = toDouble.ToString("n", System.Globalization.CultureInfo.GetCultureInfo("NL-be"));
//output: 1.234,56
Line 5: txtBase2.Text = jj.ToString();
}
private void txtBase2_GotFocus(object sender, EventArgs e)
{
Line 6: //when Entering (get in) the TEXTBOX
Line 7: //input 1.234,56
Line 8: CultureInfo ci = CultureInfo.GetCultureInfo("NL-be");
Line 9: string decimalFormatted = Convert.ToDecimal(txtBase2.Text, ci).ToString();
//Output 1234,56
Line 10: txtBase2.Text = decimalFormatted;
}
答案 0 :(得分:1)
我无法再测试这一点,在我的机器上运行Windows 8,但这段代码很危险。 非常可能会在Windows消息循环中的非常脆弱的位置抛出异常。 64位操作系统(Vista和Win7)上的问题,EXE项目的Platform目标设置为x86。您可以通过在“输出”窗口中查找“第一次机会”异常通知来验证该理论。并使用Debug + Exceptions进行诊断,勾选CLR异常的Thrown复选框。或者将平台目标更改为AnyCPU。
GotFocus和LostFocus的另一个强有力的指标是看着设计师的可见事件。选择文本框,然后单击“属性”窗口中的闪电图标。请注意GotFocus和LostFocus如何在那里列出不。 Enter和Leave事件是替代方案。
您需要以不同方式执行此操作。首先,您必须使用Decimal.TryParse(),这样您才能看到转换失败而没有异常。这是预期的失败,用户可以轻松地将文本框留空或键入不是数字的字符串。当然,当发生这种情况时,您不希望程序崩溃。
其次,使用Validating事件而不是Leave或LostFocus事件。您可以设置e.Cancel = true以防止焦点更改并强制用户输入有效数字。当Text无法转换时,使用ErrorProvider组件显示警告。如果您这样做,那么您不再需要Enter事件。检查this answer以获取执行此操作的NumberBox控件。
答案 1 :(得分:0)
这可能是您在处理程序中设置Control.Text属性的副作用。
Control.GotFocus()的文档可以这样说:
通常,GotFocus和LostFocus事件仅在更新UICues或编写自定义控件时使用。相反,Enter和Leave事件应该用于除Form类之外的所有控件,该类使用Activated和Deactivate事件。
如果您使用Enter
和Leave
代替吗?
另外,如果您注释掉设置Control.Text的代码,是否会出现问题?