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类似,但是您需要小心,不要对每个选择多次执行同一个函数。