我左侧有一个树状视图。选择节点会在右侧的表单中显示相关信息。
我是否能够同时将树和任何一个控件(文本框,组合框,复选框)保持在右侧?这将使用户能够选择一个字段,进行更改,选择另一个节点,而无需返回并再次选择相同的字段,只需键入并更改相同字段的值。
感谢名单。
修改
我想人们可以手动实现这样的行为:
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
事件也被触发,但由于某种原因,它再次失去了对树的关注。
感谢名单
答案 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的评论,了解实现所寻求行为的一种方法。