MaskedTextBox.SelectAll GotFocus 不适用于鼠标

MaskedTextBox.SelectAll on GotFocus doesn't work with mouse

我想select一个MaskedTextBox的所有内容,当点击(或tabs放到)控件上时,这样可以很容易地替换旧的内容。我尝试在 Enter 事件中调用 SelectAll(),但这根本不起作用。

我转而使用 GotFocus 事件,它在通过控件切换时效果很好,但在我用鼠标单击它时不起作用。我只想在第一次 entering/focusing 控件时 select 所有内容(随后的单击可能用于定位光标以编辑现有文本)。

我添加了一个按钮,并尝试在按钮单击事件中调用 SelectAll(),但这也没有任何作用。这是怎么回事?这是一个错误吗?

我该如何解决这个问题?


重现步骤

  1. 在 Visual 中的 .NET 4.0 中创建一个新的 Windows 表单应用程序 工作室 2010.
  2. 在默认表单中添加 TextBoxMaskedTextBoxButton
  3. 将 MaskedTextBox 上的 Mask 属性 更改为“_____”。
  4. 添加一些事件处理程序:

    private void maskedTextBox1_GotFocus(object sender, EventArgs e)
    {
      Debug.WriteLine("GotFocus");
      maskedTextBox1.SelectAll();
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
      Debug.WriteLine("Click");
      maskedTextBox1.SelectAll();
    }
    
  5. 运行 程序,将一些数据输入 MaskedTextBox,通过控件返回到它。它 select 是 MaskedTextBox 的内容。

  6. Select 另一个TextBox。尝试单击 MaskedTextBox。输出显示调用了 GotFocus 事件,但文本未得到 selected。
  7. 尝试单击表单中的按钮。文本未得到 selected。

于 Visual Studio 2010 年在 Windows Forms 应用程序项目中使用 .NET 4.0 进行了测试


为什么这不是 TextBox.SelectAll() does not work with TAB

的副本

如果您注意到,标题是 "SelectAll doesn't work with TAB"。在我的例子中,确实Tab一起工作,与鼠标一起工作——完全相反的情况。该问题的答案是使用 GotFocus 事件。我已经在使用 GotFocus 事件,但它不起作用。该答案没有回答这个问题。这显然不是重复的。如果我错了,请在评论中解释。

您的 SelectAll() 正在被屏蔽文本框 select 的默认功能覆盖。我会使用 Enter 事件,它允许选项卡式输入或鼠标单击输入到屏蔽文本框。您很可能需要使用 BeginInvoke 方法。试试下面的代码。当我尝试时它对我有用...

private void maskedTextBox1_Enter(object sender, EventArgs e)
{
    BeginInvoke((Action) delegate { SetMaskedTextBoxSelectAll((MaskedTextBox) sender); });
}

private void SetMaskedTextBoxSelectAll(MaskedTextBox txtbox)
{
    txtbox.SelectAll();
}

在 Select 之前执行 Focus 都对我有用:

private void Masked_Enter(object sender, EventArgs e) {
    ((MaskedTextBox)sender).Focus();
    ((MaskedTextBox)sender).SelectAll();
}