在 focus/clicked 时尝试 select TextBox 中的所有文本
Try to select all text in TextBox when focus/clicked
我尝试模仿用户单击用户名字段(例如)时的行为,并且所有文本(名称)将自动 selected 以便更容易地用新文本替换它。但是,当用户再次单击该字段时,text/name 将变为未selected 状态,因此用户可以继续从光标处写入文本。我相信每个人都知道我想描述什么,因为当我们在文本字段中书写或想要修改其内容时,我们都会遇到很多次...
所以问题是当我使用 Enter focus 事件并应用 SelectAll() 时,根本不起作用!文本仍未 selected。我也尝试使用 Click 事件,效果很好,但是第二次单击时我遇到了困难,因为所有鼠标单击 运行 SelectAll() 方法再次文本始终仍然 selected.. 可能我可以使用全局变量存储文本的 selection 状态并改变状态 vica-versa,但如果不需要,我不想使用任何额外的变量(每个用于所有 TextBox ... 不)。
应该有一个简单而优雅的解决方案,因为许多应用程序和网站都使用这种行为来让用户的生活更轻松。我阅读了一些论坛并找到了一些解决方案,但它们看起来比我希望的要复杂得多。
这是我代码的相关部分...没什么特别的!
private void G_tbx_canvasSize_Enter(object sender, EventArgs e)
{
(sender as TextBox).SelectAll();
}
这应该以这种方式工作:
- 用户点击文本框 (TB)
- TB 重点
- 代码运行和select全文
- 用户再次点击 TB
- 因为这已经聚焦,代码不会再次 运行 所以默认情况下文本 unselect 本身..(我测试过这个!)
- 如果用户点击离开并再次点击 TB,一切都会 运行 一次又一次..
请帮忙!我不明白为什么会发生任何问题,这不应该发生...
提前致谢!
您需要组合 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;
}
您希望单击事件 select 仅当文本框刚刚输入时显示所有文本。 Enter 事件中的额外 SelectAll
调用存在,因为如果没有它,正常的“select 将此控件切换到时的所有文本”行为不会发生。
按照@jimi 的建议,另一种方法是执行以下操作:
private void textBox3_Enter(object sender, EventArgs e)
{
BeginInvoke(new Action(() => (sender as TextBox).SelectAll()));
}
这会将对 SelectAll
的调用 post 放入表单的消息队列中。在初始鼠标单击的所有消息处理完成后,相关代码将 运行。
我不确定您是否应该等待 GotFocus 事件。也许对 Enter 事件做出反应更好。
但即使您愿意这样做,也无济于事,因为在这些事件中的每一个之后,您都会得到一个 TextBox.Click,这将 select 删除您的 text.ou获取 TextBox.Click 事件。
如果您经常使用具有这种特殊行为的 TextBox,请考虑创建一个派生自 TextBox 的 TextBoxWithSpecialClickBehaviour class,并覆盖 OnEnter 和 OnClick。
class TextBoxWithSpecialClickBehaviour : TextBox
{
public bool SelectAllTextOnGetFocus {get; set;} = true;
// TODO: override some default behaviour
}
覆盖 OnEnter 和 OnClick
protected override void OnEnter (EventArgs e)
{
// select all text
if (this.SelectAllTextOnGetFocus)
base.SelectAll();
// raise the event
base.OnEnter(e);
}
我认为您应该先 Select 文本,然后其他人才能得到通知。因此,如果事件处理程序询问文本是否为 selected,他们会得到正确的答案。但请注意,这些事件处理程序可能会再次取消select 文本。
protected virtual void OnClick (EventArgs e)
{
if (this.SelectAllTextOnGetFocus)
{
// if nothing selected: select all, if anything selected: deselect all
if (base.SelectionLength = 0)
base.SelectAll();
else
base.SelectionLength = 0;
}
base.OnClick();
}
稍微试验一下:覆盖 OnEnter 还是 OnGotFocus?也许您还需要设置 TextBox.SelectionStart。
如果您不打算多次重复使用此TextBox,对相应的事件做出反应就足够了。
顺便问一下:您确定要这种行为吗?如果用户点击,然后开始编辑,他点击了编辑文本中的某处,因为他想 select 将一些文本复制粘贴到他正在编辑的文本的不同部分,会发生什么情况。
- 文本 ABCDEFG
- 完全单击文本框 ABCDEFG selected
- 在 C 和 D 之间点击:无 selected
- 拖动鼠标到F:ABCDEFGselected
- Ctrl C 复制文本。文本仍必须 selected 吗?
- 在 A 和 B 之间单击以粘贴文本。
- 因为点击 ABCDEFG 完全 selected
你确定要这个吗?运营商是否期望这样?
我尝试模仿用户单击用户名字段(例如)时的行为,并且所有文本(名称)将自动 selected 以便更容易地用新文本替换它。但是,当用户再次单击该字段时,text/name 将变为未selected 状态,因此用户可以继续从光标处写入文本。我相信每个人都知道我想描述什么,因为当我们在文本字段中书写或想要修改其内容时,我们都会遇到很多次...
所以问题是当我使用 Enter focus 事件并应用 SelectAll() 时,根本不起作用!文本仍未 selected。我也尝试使用 Click 事件,效果很好,但是第二次单击时我遇到了困难,因为所有鼠标单击 运行 SelectAll() 方法再次文本始终仍然 selected.. 可能我可以使用全局变量存储文本的 selection 状态并改变状态 vica-versa,但如果不需要,我不想使用任何额外的变量(每个用于所有 TextBox ... 不)。
应该有一个简单而优雅的解决方案,因为许多应用程序和网站都使用这种行为来让用户的生活更轻松。我阅读了一些论坛并找到了一些解决方案,但它们看起来比我希望的要复杂得多。
这是我代码的相关部分...没什么特别的!
private void G_tbx_canvasSize_Enter(object sender, EventArgs e)
{
(sender as TextBox).SelectAll();
}
这应该以这种方式工作:
- 用户点击文本框 (TB)
- TB 重点
- 代码运行和select全文
- 用户再次点击 TB
- 因为这已经聚焦,代码不会再次 运行 所以默认情况下文本 unselect 本身..(我测试过这个!)
- 如果用户点击离开并再次点击 TB,一切都会 运行 一次又一次..
请帮忙!我不明白为什么会发生任何问题,这不应该发生...
提前致谢!
您需要组合 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;
}
您希望单击事件 select 仅当文本框刚刚输入时显示所有文本。 Enter 事件中的额外 SelectAll
调用存在,因为如果没有它,正常的“select 将此控件切换到时的所有文本”行为不会发生。
按照@jimi 的建议,另一种方法是执行以下操作:
private void textBox3_Enter(object sender, EventArgs e)
{
BeginInvoke(new Action(() => (sender as TextBox).SelectAll()));
}
这会将对 SelectAll
的调用 post 放入表单的消息队列中。在初始鼠标单击的所有消息处理完成后,相关代码将 运行。
我不确定您是否应该等待 GotFocus 事件。也许对 Enter 事件做出反应更好。
但即使您愿意这样做,也无济于事,因为在这些事件中的每一个之后,您都会得到一个 TextBox.Click,这将 select 删除您的 text.ou获取 TextBox.Click 事件。
如果您经常使用具有这种特殊行为的 TextBox,请考虑创建一个派生自 TextBox 的 TextBoxWithSpecialClickBehaviour class,并覆盖 OnEnter 和 OnClick。
class TextBoxWithSpecialClickBehaviour : TextBox
{
public bool SelectAllTextOnGetFocus {get; set;} = true;
// TODO: override some default behaviour
}
覆盖 OnEnter 和 OnClick
protected override void OnEnter (EventArgs e)
{
// select all text
if (this.SelectAllTextOnGetFocus)
base.SelectAll();
// raise the event
base.OnEnter(e);
}
我认为您应该先 Select 文本,然后其他人才能得到通知。因此,如果事件处理程序询问文本是否为 selected,他们会得到正确的答案。但请注意,这些事件处理程序可能会再次取消select 文本。
protected virtual void OnClick (EventArgs e)
{
if (this.SelectAllTextOnGetFocus)
{
// if nothing selected: select all, if anything selected: deselect all
if (base.SelectionLength = 0)
base.SelectAll();
else
base.SelectionLength = 0;
}
base.OnClick();
}
稍微试验一下:覆盖 OnEnter 还是 OnGotFocus?也许您还需要设置 TextBox.SelectionStart。
如果您不打算多次重复使用此TextBox,对相应的事件做出反应就足够了。
顺便问一下:您确定要这种行为吗?如果用户点击,然后开始编辑,他点击了编辑文本中的某处,因为他想 select 将一些文本复制粘贴到他正在编辑的文本的不同部分,会发生什么情况。
- 文本 ABCDEFG
- 完全单击文本框 ABCDEFG selected
- 在 C 和 D 之间点击:无 selected
- 拖动鼠标到F:ABCDEFGselected
- Ctrl C 复制文本。文本仍必须 selected 吗?
- 在 A 和 B 之间单击以粘贴文本。
- 因为点击 ABCDEFG 完全 selected
你确定要这个吗?运营商是否期望这样?