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

时间:2014-01-16 21:28:37

标签: .net vb.net winforms user-controls

我想在这里理解一个概念。如果提供任何解决方案,将不胜感激。

我的场景是表单上有3个嵌套控件。嵌套子项在包含控件的表单时如何获得焦点。换句话说,会发生什么事件。

在下一个场景中,当点击最内层的孩子时,现在获得焦点(如果我错了,请纠正我)。父母表格是否会获得焦点。如果是,那么这是如何工作的?发生了什么事件。

任何答案都会非常感激。

1 个答案:

答案 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);    
            }
        }
    }