【问题标题】:textbox.Focus() not working in C#textbox.Focus() 在 C# 中不起作用
【发布时间】:2011-06-03 09:53:17
【问题描述】:

我想知道为什么这段代码无法聚焦文本框...?

private void sendEmail_btn_Click(object sender, EventArgs e)
{    
    String sendTo = recipientEmail_tbx.Text.Trim();
    if (!IsValidEmailAddress(sendTo))
    {
        MessageBox.Show("Please Enter valid Email address","Cognex" MessageBoxButtons.OK, MessageBoxIcon.Error);                
        recipientEmail_tbx.Focus();
    }
}

【问题讨论】:

  • 您发布的代码无法编译——MessageBox.Show 调用的最佳重载匹配有一些无效参数。修复后(我指定了标题),代码将完全按预期工作并将焦点设置到文本框。有什么问题?是否希望已输入的文本显示为选中
  • @Cody: 已编辑...立即查看:)
  • 就像我说的那样,即使我通过添加标题字符串(与您所做的完全相同)修复了对 MessageBox.Show 的调用,代码仍然可以正常工作。显示消息框后,焦点被设置回文本框。为什么说它“不起作用”?您是否希望在文本框中输入的文本显示为选中/突出显示?
  • 不不...如果光标停在文本框中就足够了...但它在这里不起作用..即使我尝试过这个。ActiveControl=recipientEmail_tbx...没有运气:(
  • @Sisya:嗯,这似乎是其他问题。可能当您聚焦控件时,表单没有被选中,或者被后台操作阻止?

标签: c# .net winforms textbox focus


【解决方案1】:

Form_Activated 事件处理程序与 firstActivation 布尔值结合使用。

private bool firstActivation = true;
private Control firstWindowsControl = null;

...

private void DynamicForm_Activated(object sender, EventArgs e)
{
    if (firstActivation)
    {
        firstActivation = false;
        bool fwcPresent = (firstWindowsControl != null);
        Console.WriteLine($"DynamicForm_Activated: firstWindowControl present: {fwcPresent}");
        if (fwcPresent)
        {
            firstWindowsControl.Focus();
        }

    }

【讨论】:

    【解决方案2】:

    添加延迟一些miliSec。延迟然后拨打Focus(),不要忘记放入Dispatcher

    Task.Delay(100).ContinueWith(_ =>
         {
             Application.Current.Dispatcher.Invoke(new Action(() =>
             {
                 TextBoxNAme.Focus();
             }));
         });
    

    【讨论】:

    • 虽然我不喜欢这些 hacky “add-a-delay-to-make-things-work” 类型的解决方案,但它确实让我摆脱了多线程 C# 应用程序的束缚.所以谢谢你,为你+1好先生!
    • 效果很好,谢谢你
    【解决方案3】:

    即使我尝试了很多上述解决方案,但没有一个对我有用,因为我试图专注于页面加载。最后,我得到了这个解决方案,它奏效了。

    private void txtBox_LayoutUpdated(object sender, EventArgs e)
    {
        txtBox.Focus();
    }
    

    【讨论】:

    • 使用 Select() 代替!
    【解决方案4】:

    改用Select()

    recipientEmail_tbx.Select();
    

    Focus 是一种低级方法,主要用于自定义控件作者。相反,应用程序程序员应该对子控件使用 Select 方法或 ActiveControl 属性,或对表单使用 Activate 方法。

    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

    【讨论】:

    • Error 1 No overload for method 'Select' takes 0 arguments
    • 无参数重载从1.1开始就存在:msdn.microsoft.com/en-us/library/…
    • 当 Select() 不适合您时:通常其他一些控件会成为焦点。因此,请确保您对控件的 Select() 调用是最后一次调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2015-09-08
    • 2014-04-29
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多