我想在这里理解一个概念。如果提供任何解决方案,将不胜感激。
我的场景是表单上有3个嵌套控件。嵌套子项在包含控件的表单时如何获得焦点。换句话说,会发生什么事件。
在下一个场景中,当点击最内层的孩子时,现在获得焦点(如果我错了,请纠正我)。父母表格是否会获得焦点。如果是,那么这是如何工作的?发生了什么事件。
任何答案都会非常感激。
答案 0 :(得分:0)
具有键盘/输入能力的控件是对Focused
返回true的控件,而不是其他任何东西。当用户选择控件或以编程方式调用Focus()
方法时,嵌套子项将获得焦点。
老实说,跟踪事件顺序的最佳方法是创建示例应用程序,为GotFocus事件添加事件处理程序并跟踪当时哪些控件具有焦点。因为我正在等待编译的东西,所以我继续这样做。
实施例:
我的表单有一个带有文本框的面板和一个带有第二个文本框的面板。所有5个控件都使用相同的方法(GotFocus
)处理ControlGotFocus
,通过递归方法运行它以检查焦点并在TextBox1
中列出数据。 Panelx没有生成GotFocus事件,也没有生成Form4,这可能是因为添加了处理程序。 TextBoxx始终正确生成事件,并始终列出一个且只有一个控件具有焦点。
public Form4()
{
InitializeComponent();
this.GotFocus += ControlGotFocus;
this.panel1.GotFocus += ControlGotFocus;
this.panel2.GotFocus += ControlGotFocus;
this.panel3.GotFocus += ControlGotFocus;
this.textBox3.GotFocus += ControlGotFocus;
this.textBox2.GotFocus += ControlGotFocus;
}
void ControlGotFocus(object sender, EventArgs e)
{
this.textBox1.Text = string.Format("{0} generated the focus event",((Control)sender).Name);
CheckForFocus(this);
}
private void CheckForFocus(Control c)
{
foreach (Control item in c.Controls)
{
if (item.Focused)
{
this.textBox1.Text += string.Format("{0}{1} has focus.", Environment.NewLine, item.Name);
}
if (item.HasChildren && item.ContainsFocus)
{
CheckForFocus(item);
}
}
}