我正在使用Winforms Testbox LostFocus和Textbox GotFocus进行循环

时间:2013-03-21 12:14:50

标签: c# winforms event-handling

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

NUMBERS的转换工作正常,它只是循环。因此,当我在文本框上单击鼠标时,它会启动:txtBase2

  1. 它进入txtBase2_GotFocus事件第8行

  2. 然后执行第9行

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

  4. 然后再回到txtBase2_GotFocus方法到lin8。

  5. 以上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;
        }
    

2 个答案:

答案 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属性的副作用。

您应该真正使用EnterLeave事件。

Control.GotFocus()的文档可以这样说:

  
    

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

  

如果您使用EnterLeave代替吗?

,您是否还会遇到此问题?

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