我如何保持多个控制焦点

本文关键字:控制 焦点 何保持 | 更新日期: 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的评论,了解实现您所寻求的行为的一种方法。