C# 如何使多个控件保持焦点?

C# 如何使多个控件保持焦点?,c#,winforms,focus,C#,Winforms,Focus,我在左边有一个树视图。选择节点会在右侧的表单中显示相关信息 我能同时保持树和右边的任何一个控件(文本框、组合框、复选框)的焦点吗?这将使用户能够选择字段、进行更改、选择另一个节点,而无需返回并再次选择同一字段,只需键入并更改同一字段的值即可 塔克斯 编辑 我认为可以手动实现这种行为: private Control __cFocus; private void {anyControl}_Focus(object sender, EventArgs e) { __cFocus = (Co

我在左边有一个树视图。选择节点会在右侧的表单中显示相关信息

我能同时保持树和右边的任何一个控件(文本框、组合框、复选框)的焦点吗?这将使用户能够选择字段、进行更改、选择另一个节点,而无需返回并再次选择同一字段,只需键入并更改同一字段的值即可

塔克斯

编辑
我认为可以手动实现这种行为:

private Control __cFocus;

private void {anyControl}_Focus(object sender, EventArgs e)
{
    __cFocus = (Control)sender;
}

private void treeView1_AfterSelect(object sender, EventArgs e)
{
    __cFocus.Focus();
}
我只是想知道是否存在一个自动/更优雅的解决方案

编辑2
好的,看来我必须手动实现它。然后是手动执行。然而,现在似乎还有另一个问题;不确定我是否应该单独问这个问题

选择节点时,文本框会按预期获得焦点,但仅在使用键盘时。使用鼠标选择节点时,该选项不起作用。首先,我认为可能是鼠标事件造成了干扰,但stepping显示首先触发了
MouseUp
事件,然后触发了设置焦点的
AfterSelect
事件,因此我认为它没有干扰。文本框的
Enter
事件也会被触发,但由于某种原因,它会再次失去对树的关注


Thanx

不,不能同时对两个控件进行对焦。但是您可以在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
}

这样,每次您在树视图中选择一个项目时,请检查文本框以进行更改并根据需要保存,然后您将重新聚焦文本框以进行下一次编辑

不,您可能不会,在任何给定时间,只有一个控件处于焦点位置


请参阅Moonlight的评论,了解实现您所寻求的行为的一种方法。

如果您想专注于此,可以使用usercontrol。您可以将文本框放在usercontrol上,并使用treeview select上的set properties将此文本框的焦点设置在usercontrol上

只有一个元素具有焦点

但我有一个想法可以解决你的问题。假设你有一个带有树视图和文本框的窗口。将TreeView的HideSelection属性设置为false,并订阅AfterSelect事件(如edeperson已回答),如下所示:

private void OnTreeViewAfterSelect(object sender, TreeViewEventArgs e)
{
    textBox1.Text = e.Node.Text;
    textBox1.Focus();
}
然后订阅文本框的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}");
    }
}
private void OnTextBoxLeave(object sender, EventArgs e)
{
    if (treeView1.SelectedNode != null)
    {
        treeView1.SelectedNode.Text = textBox1.Text;
    }
}
最后订阅文本框的Leave事件,并在event方法中执行以下操作:

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}");
    }
}
private void OnTextBoxLeave(object sender, EventArgs e)
{
    if (treeView1.SelectedNode != null)
    {
        treeView1.SelectedNode.Text = textBox1.Text;
    }
}

而且,瞧,它应该像您预期的那样工作…

我相信您希望绑定tree和其他控件的值,就像绑定数据的信息面板一样;但是,这是否仍然会从信息控件中删除焦点,从而删除文本框?我也尝试了手动方式-正如我编辑的帖子中所建议的那样-但是使用鼠标选择节点不起作用。当聚焦树并使用键盘(向上/向下或第一个字母)时,它仍然有效。这促使我寻找另一种选择。对鼠标选择有什么建议吗?你可能需要订阅多个活动。与mouseup类似,但是您需要小心,不要对每个选择多次执行同一个函数。