尝试在焦点/单击时选择 TextBox 中的所有文本

Bus*_*kie 0 c# events textbox click winforms

我尝试模仿用户单击用户名字段(例如)时的行为,并且将自动选择所有文本(名称),以便更轻松地用新文本替换它。但是,当用户再次单击该字段时,文本/名称将变为未选中状态,因此用户可以继续从光标写入文本。我确信每个人都知道我想描述什么,因为当我们在文本字段中写入或想要修改其内容时,我们都多次遇到过这种情况......

所以问题是当我使用 Enter focus 事件并应用 SelectAll() 时,根本不起作用!文本仍未选择。我也尝试使用 Click 事件,效果很好,但是第二次单击时遇到了困难,因为所有鼠标单击再次运行 SelectAll() 方法,文本始终仍然处于选中状态。也许我可以使用存储选择状态的全局变量文本和更改状态反之亦然,但如果没有必要,我不想使用任何额外的变量(每个变量都用于所有 TextBox...不)。

应该有一个简单而优雅的解决方案,因为许多应用程序和网站都使用这种行为来使用户的生活更轻松。我阅读了一些论坛并找到了一些解决方案,但它们看起来比我希望的更复杂。

这是我的代码的相关部分......没什么特别的!

    private void G_tbx_canvasSize_Enter(object sender, EventArgs e)
    {
        (sender as TextBox).SelectAll();
    }
Run Code Online (Sandbox Code Playgroud)

这应该以这种方式工作:

  • 用户单击文本框 (TB)
  • 专注于结核病
  • 代码运行并选择所有文本
  • 用户再次点击 TB
  • 由于这已经集中,代码将不会再次运行,因此默认情况下文本会取消选择自身..(我对此进行了测试!)
  • 如果用户点击离开并再次点击 TB,一切都会一次又一次地运行。

请帮忙!我不明白为什么会出现这种情况,这不应该发生......

提前致谢!

Fly*_*g57 5

您需要结合 Enter 和 Click 事件。当处理程序连接到适当的事件时,此代码适用于我(在名为 textBox2 的文本框上):

private bool textBox2JustEntered = false;
private void textBox2_Enter(object sender, EventArgs e)
{
    textBox2.SelectAll();
    textBox2JustEntered = true;
}

private void textBox2_Click(object sender, EventArgs e)
{
    if (textBox2JustEntered)
    {
        textBox2.SelectAll();
    }

    textBox2JustEntered = false;
}
Run Code Online (Sandbox Code Playgroud)

您希望单击事件仅在刚刚输入文本框时选择所有文本。Enter 事件中存在额外的SelectAll调用,因为如果没有它,正常的“选择此控件切换到的位置时选择所有文本”行为就不会发生。

正如 @jimi 所建议的,另一种方法是执行以下操作:

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

这会将调用发布SelectAll到表单的消息队列中。相关代码将在初始鼠标单击的所有消息处理完成后运行。

  • 只需“Enter”事件中的“BeginInvoke(new Action(()=> (sender as TextBox).SelectAll()));”即可。 (2认同)