0

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

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

  1. 它进入 txtBase2_GotFocus 事件行 8

  2. 然后执行第 9 行

  3. 然后跳转到 txtBase2_Lostfocus 方法到第 3 行

  4. 然后再回到 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;
    }
4

2 回答 2

1

我无法再测试这个,在我的机器上运行 Windows 8,但这段代码很危险。它可能在 Windows 消息循环中非常脆弱的点抛出异常。EXE 项目的平台目标设置为 x86 的 64 位操作系统(Vista 和 Win7)出现问题。您可以通过在输出窗口中查看“第一次机会”异常通知来验证该理论。并使用 Debug + Exceptions 诊断它,勾选 CLR 异常的 Throw 复选框。或者通过将平台目标更改为 AnyCPU。

GotFocus 和 LostFocus 的另一个重要指标是查看设计器中的可见事件。选择文本框并单击“属性”窗口中的闪电图标。请注意 GotFocus 和 LostFocus没有在此处列出。Enter 和 Leave 事件是备选方案。

您将需要以不同的方式执行此操作。首先,您必须使用 Decimal.TryParse() 以便您可以看到转换失败,无一例外。这是预期的失败,用户可以轻松地将文本框留空或键入不是数字的字符串。当这种情况发生时,您当然不希望您的程序崩溃。

其次,使用 Validating 事件而不是 Leave 或 LostFocus 事件。您可以设置 e.Cancel = true 以防止焦点更改并强制用户输入有效数字。当 Text 不可转换时,使用 ErrorProvider 组件显示警告。如果你做对了,那么你就不再需要 Enter 事件了。检查此答案以获取执行此操作的 NumberBox 控件。

于 2013-03-21T13:01:19.220 回答
0

这可能是您在处理程序中设置 Control.Text 属性的副作用。

您真的应该使用EnterLeave事件。

Control.GotFocus()的文档有这样的说法:

通常,GotFocus 和 LostFocus 事件仅在更新 UICues 或编写自定义控件时使用。相反,Enter 和 Leave 事件应用于除 Form 类之外的所有控件,Form 类使用 Activated 和 Deactivate 事件。

如果您使用EnterandLeave代替,您仍然会遇到问题吗?

另外,如果您注释掉设置 Control.Text 的代码,您是否会遇到问题?

于 2013-03-21T12:26:37.687 回答