我如何保持多个控制焦点
本文关键字:控制 焦点 何保持 | 更新日期: 2023-09-27 18:15:20
我在左侧有一个树视图。选择节点后,将在右侧的表单中显示相关信息。
我能保持树和任何一个控件(文本框,组合框,复选框)在焦点的右边在同一时间吗?这将使用户能够选择一个字段,进行更改,选择另一个节点,而不必返回并再次选择相同的字段,只需键入并更改相同字段的值。
谢谢。
编辑
我想可以手动实现这样的行为:
private Control __cFocus;
private void {anyControl}_Focus(object sender, EventArgs e)
{
__cFocus = (Control)sender;
}
private void treeView1_AfterSelect(object sender, EventArgs e)
{
__cFocus.Focus();
}
我只是想知道是否存在一个自动/更优雅的解决方案
EDIT 2
好了,看来我得手动实现了。然后是手工实现。然而,现在似乎出现了另一个问题;我不确定我是否应该把这个问题单独提出来。
选择节点时,文本框按预期获得焦点,但仅在使用键盘时。当用鼠标选择节点时,它不起作用。首先,我认为这可能是一个干扰的鼠标事件,但步骤显示MouseUp
事件首先触发,然后是设置焦点的AfterSelect
事件,所以我认为它没有干扰。文本框的Enter
事件也被触发,但由于某种原因,它再次失去了对树的焦点。
谢谢
不行,你不能同时保持两个控件在焦点上。但你能做的是在treeview AfterSelect事件中将焦点设置为目标控件
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
textBox1.Focus();
textBox1.SelectAll();
}
然后在文本框中留下,保存更改,如下所示:
private void textBox1_Leave(object sender, EventArgs e)
{
//save changes here
}
这样,每次你在树视图中选择一个项目时,检查你的文本框是否有变化,并根据需要保存,然后你将重新关注你下一次编辑的文本框
只能有一个元素具有焦点!
但是我有一个主意可以解决你的问题。假设你有一个带有TreeView和TextBox的窗口。将TreeView的hidesselection属性设置为false,并订阅AfterSelect事件(如edeperson已经回答),如下所示:private void OnTreeViewAfterSelect(object sender, TreeViewEventArgs e)
{
textBox1.Text = e.Node.Text;
textBox1.Focus();
}
然后订阅TextBox的KeyDown事件,并在事件方法中执行以下操作:
private void OnTextBoxKeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.Down))
{
treeView1.Focus();
SendKeys.Send(e.KeyCode == Keys.Up ? "{UP}" : "{DOWN}");
}
}
最后订阅TextBox的Leave事件,并在事件方法中做如下操作:
private void OnTextBoxLeave(object sender, EventArgs e)
{
if (treeView1.SelectedNode != null)
{
treeView1.SelectedNode.Text = textBox1.Text;
}
}
如果你想关注它,你可以使用usercontrol。你可以把你的文本框放在usercontrol上,并使用set properties on treeview select将这个文本框的焦点设置在usercontrol上。
不可以,任何时候只能有一个控件处于焦点。
请参阅Moonlight的评论,了解实现您所寻求的行为的一种方法。