我尝试做一些格式化和我的格式化结果工作良好。问题是它是Textbox LostFocus和GotFocus事件的循环。所以在调试中,它会相互跳转,我不知道我做错了什么。
数字的转换工作正常,这只是循环。所以当我用鼠标点击文本框时它就开始了:txtBase2
-
它进入txtBase2_GotFocus事件第8行
-
则执行第9行
-
然后跳到第3行
的txtBase2_Lostfocus方法 然后返回txtBase2_GotFocus方法到lin8。
以上4步仍在循环中…而且它不会停止我做错了什么?或者我看不见的东西是什么?
ps:完成Amount值的转换。
整个思路是:
-
当用户在文本框中输入数字并离开文本框时,格式应为: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;
}
我不能再在我的机器上运行Windows 8测试这个,但是这个代码是危险的。非常很可能在Windows消息循环中的一个非常脆弱的点抛出异常。64位操作系统(Vista和Win7)上的问题,EXE项目的平台目标设置为x86。您可以通过查看Output窗口中的"第一次机会"异常通知来验证该理论。并使用Debug + Exceptions进行诊断,选中抛出的CLR异常复选框。或者将平台目标更改为AnyCPU。
GotFocus和LostFocus有共同点的另一个强有力的指标是查看设计器中的可见事件。选择文本框,然后单击"属性"窗口中的闪电图标。注意GotFocus和LostFocus都是而不是。Enter和Leave事件是可选的。
您需要以不同的方式执行此操作。首先,必须使用Decimal.TryParse(),这样您就可以看到转换失败而不会出现异常。这是一个预期的失败,用户可以很容易地将文本框保留为空或键入一个不是数字的字符串。当这种情况发生时,你当然不希望你的程序崩溃。
其次,使用validation事件而不是Leave或LostFocus事件。你可以设置e.Cancel = true来防止焦点改变,并强制用户输入一个有效的号码。当Text不可转换时,使用ErrorProvider组件显示警告。如果你做对了,那么你就不再需要Enter事件了。
这可能是您设置控件的副作用。文本属性。
你应该使用Enter和Leave事件。
Control.GotFocus()的文档是这样说的:
通常,GotFocus和LostFocus事件仅在更新ui或编写自定义控件时使用。相反,Enter和Leave事件应该用于除Form类之外的所有控件,Form类使用Activated和Deactivate事件。
如果你使用Enter
和Leave
,你仍然得到这个问题吗?
另外,如果你注释掉设置Control.Text的代码,你会得到这个问题吗?