2

我是 C# 的初学者,我正在开发一个基本的应用程序。
我想检查文本框的值是否是具有以下代码的数字:

private void check_value(object sender)
    {
        TextBox tb = (TextBox)sender ;
        if (!Utility.isNumeric(tb.Text)){
            MessageBox.Show(tb.Text.Length.ToString());
            tb.Focus();
        }
    }

    private void Amount_1_LostFocus(object sender, RoutedEventArgs e)
    {
        check_value(sender);
    }

当我在文本框中输入一个字母时,会出现一个无限循环,似乎 tb.Focus() 实际上会导致 LostFocus 事件被递归调用。我不明白为什么调用一个对象的 Focus 方法会触发同一个对象的 LostFocus 事件。

4

3 回答 3

5

打开模态MessageBox是失去焦点的原因。尝试挂钩Validating事件。

于 2011-02-22T00:38:11.370 回答
0

正如我之前在 Xaqron 提供的链接中所说,在 LostFocus 事件中禁止使用 Focus 方法。
由于我正在开发 WPF 应用程序,因此没有 Validating 事件和 CausesValidation 属性,因此验证内容的其他方法是使用 TextChanged 事件或使用绑定验证。

谢谢您的回答。

于 2011-02-22T23:26:53.263 回答
0

当然,在一个完全有效的程序中,您不应该更改 LostFocus 事件中的 Focus。这也适用于 Enter、GotFocus、Leave、Validating 和 Validated 事件,Ms 在文档中明确说明了这一点https://docs.microsoft.com/pl-pl/dotnet/api/system.windows.forms.control.lostfocus . 但是,在非常不寻常的情况下,您可以使用计时器来触发对焦点的更改,从而绕过这个问题。

private TextBox tb = null;
private System.Windows.Forms.Timer MyTimer;

private void initialize()
{
    MyTimer.Tick += new System.EventHandler(MyTimer_Tick);
    MyTimer.Enable = false;
    MyTimer.Interval = 100;
}

private void check_value(object sender)
{
    tb = (TextBox)sender ;
    if (!Utility.isNumeric(tb.Text)){
        MessageBox.Show(tb.Text.Length.ToString());
        MyTimer.Enable = true;
    }
}

private void Amount_1_LostFocus(object sender, RoutedEventArgs e)
{
    check_value(sender);
}

private void MyTimer_Tick(object sender, EventArgs e)
{
    MyTimer.Enabled = false;
    if (tb!=null) tb.Focus();
}
于 2021-11-05T13:03:52.243 回答