如何保持多个控件的焦点?

时间:2011-11-22 12:18:35

标签: c# winforms focus

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

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

感谢名单。

修改
我想人们可以手动实现这样的行为:

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
好的,所以我似乎必须手动实现它。然后手动实现它。但是,现在似乎还有另一个问题;不确定我是否应该将此作为一个单独的问题。

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

感谢名单

4 个答案:

答案 0 :(得分:2)

不,你不能同时保持两个控件的焦点。但您可以做的是将焦点设置为树视图AfterSelect事件中的目标控件

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    textBox1.Focus();
    textBox1.SelectAll();
}

然后在你的文本框中离开,保存更改,如下所示:

private void textBox1_Leave(object sender, EventArgs e)
{
    //save changes here
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只有一个元素才有焦点!

但我有一个想法可以解决你的问题。假设你有一个带有TreeView和TextBox的窗口。将TreeView的HideSelection属性设置为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;
    }
}

而且,它应该像你期望的那样工作......

答案 3 :(得分:0)

不,你可能不会,在任何给定时间只有一个控件可能会聚焦。

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