我在Winforms Testbox LostFocus和Textbox GotFocus的循环中

本文关键字:GotFocus 循环 Textbox Winforms Testbox LostFocus 我在 | 更新日期: 2023-09-27 18:04:58

我尝试做一些格式化和我的格式化结果工作良好。问题是它是Textbox LostFocus和GotFocus事件的循环。所以在调试中,它会相互跳转,我不知道我做错了什么。

数字的转换工作正常,这只是循环。所以当我用鼠标点击文本框时它就开始了:txtBase2

  1. 它进入txtBase2_GotFocus事件第8行

  2. 则执行第9行

  3. 然后跳到第3行

  4. 的txtBase2_Lostfocus方法
  5. 然后返回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;
    }

我在Winforms Testbox LostFocus和Textbox GotFocus的循环中

我不能再在我的机器上运行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事件。

如果你使用EnterLeave,你仍然得到这个问题吗?

另外,如果你注释掉设置Control.Text的代码,你会得到这个问题吗?