在VB.Net中,通过选择窗体将焦点设置为嵌套控件,反之亦然

在VB.Net中,通过选择窗体将焦点设置为嵌套控件,反之亦然,.net,vb.net,winforms,user-controls,.net,Vb.net,Winforms,User Controls,我试图理解这里的一个概念。如能提供任何解决方案,将不胜感激 我的场景是表单上有3个嵌套控件。当窗体包含控件时,嵌套子项如何获得焦点。换句话说,触发了哪些事件 在下一个场景中,单击最里面的子对象,现在获得焦点(如果我错了,请纠正我)。父窗体是否会获得焦点。如果是,那么这是如何工作的?触发了哪些事件 任何答案都将不胜感激 具有键盘/输入功能的控件是对聚焦的返回true的控件,而不是其他控件。当用户选择控件或以编程方式调用focus()方法时,嵌套子对象将获得焦点 老实说,跟踪事件顺序的最佳方法是创建

我试图理解这里的一个概念。如能提供任何解决方案,将不胜感激

我的场景是表单上有3个嵌套控件。当窗体包含控件时,嵌套子项如何获得焦点。换句话说,触发了哪些事件

在下一个场景中,单击最里面的子对象,现在获得焦点(如果我错了,请纠正我)。父窗体是否会获得焦点。如果是,那么这是如何工作的?触发了哪些事件


任何答案都将不胜感激

具有键盘/输入功能的控件是对聚焦的
返回true的控件,而不是其他控件。当用户选择控件或以编程方式调用
focus()
方法时,嵌套子对象将获得焦点

老实说,跟踪事件顺序的最佳方法是创建一个示例应用程序,为事件添加一个事件处理程序,并跟踪此时哪些控件具有焦点。因为我在等待编译一些东西,所以我就这样做了

例如: 我的表单有一个带有文本框的面板和一个带有第二个文本框的面板。所有5个控件都使用相同的方法(
ControlGotFocus
)处理
GotFocus
),通过递归方法运行它以检查焦点并在
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);    
            }
        }
    }