如何在鼠标单击时选择 TextBox 的所有文本?(TextBox.SelectAll() 不适用于 TextBox.Enter)

Com*_*ght 6 c# controls textbox winforms

编辑:WPF 标签是一个错误,这是winforms。


我有一个TextBox,我希望在用户单击它时突出显示其中的所有文本(以便他们可以轻松替换它)。我有以下事件处理程序链接到TextBox

private void TextBox_Enter(object sender, EventArgs e) {
    SelectAll();
}
Run Code Online (Sandbox Code Playgroud)

但是当我点击TextBox文本时,文本只被选中了几分之一秒(有时它太快了我根本看不到它)然后它又回到了一个光标。有谁知道如何解决这个问题,或者是否有任何相对简单的解决方法?谢谢。

编辑:我对TextBox.MouseClick事件尝试了同样的事情(并且它突出显示了文本)但是因为它是MouseClick每次我点击文本时突出显示的事件TextBox(即使TextBox已经有焦点)。

我也试过,SelectionStart = 0; SelectionLength = Text.Length但同样的事情发生了。这让我相信这个问题与事件有关。

我也尝试了该TextBox.GotFocus事件并遇到了完全相同的问题。

我在 Windows 窗体应用程序中执行此操作。

Bio*_*ode 12

您没有看到文本被选中的原因TextBox是当这些事件之一发生时它很忙(例如,插入符号定位)。您实际上选择了文本,然后TextBox执行并删除选择的内部事件处理程序,例如通过设置插入符号位置。

您所要做的就是等待内部事件处理程序完成。
您可以通过使用Dispatcher. 当您Dispatcher异步调用时,委托不会立即执行,而是在所有先前排队的操作(如内部事件处理程序)从调度程序队列中清除后排队并执行。

因此,使用TextBox.GotFocusWPF 中的事件(或TextBox.EnterWinForms 中的事件)和异步Dispatcher将解决问题:

WPF

private async void SelectAll_OnTextBoxGotFocus(object sender, RoutedEventArgs e)
{
  await Application.Current.Dispatcher.InvokeAsync((sender as TextBox).SelectAll);
}
Run Code Online (Sandbox Code Playgroud)

窗体

private void SelectAll_OnTextBoxEnter(object sender, EventArgs e)
{
  var textBox = sender as TextBox;
  textBox.BeginInvoke(new Action(textBox.SelectAll));
}
Run Code Online (Sandbox Code Playgroud)

  • 我添加了一个 WinForms 示例。 (2认同)