将焦点设置在容器内的第一个可聚焦控件上(例如:tableLayoutPanel,FlowlayoutPanel,GroupBox ...)

时间:2017-09-19 08:12:39

标签: c# winforms

我有一个场景,我想专注于容器内的第一个控件。

  1. 面板内部面板也存在
  2. 面板内部面板的第一次控制可能会或可能不会聚焦
  3. 第一个面板可能有也可能没有控件,在这种情况下应该指向下一个可聚焦的项目。
  4. 为此,我写了一段代码:

    Control FirstFocusableControl;
    
    static public Control FocusFirstControl(Control ctrl)
    {
        FirstFocusableControl = null;
        GetFirstControl(ctrl);
        return FirstFocusableControl;
    }
    
    //Get first control from Containers control
    static public void GetFirstControl(Control ctrl)
    {
        foreach (Control ctrlItem in ctrl.Controls)
        {
            //if (ctrlItem is Panel || ctrlItem is GroupBox)
            if(ctrlItem.HasChildren )
            {
                 GetFirstControl(ctrlItem);
            }
            //if control is not a containers,Tababble,enabled,visible to user and control length  is more than zero size 
            else if (ctrlItem is Control && ctrlItem.TabStop && ctrlItem.Enabled && ctrlItem.Visible && ctrlItem.Size.Width > 0)
            {
                FirstFocusableControl = ctrlItem;
                break;
            }
        }
    }
    

    但很少有情景如 包含面板的TableLayout面板,如果它包含一个面板,则为实习生 表格 - > TableLayoutPanel->面板 - >面板 - >控制失败。

    我一直试着调试代码。 但我总是把注意力集中在下一个控制上 即。表格 - >文本框。 请让我知道实现这个问题的方法..

1 个答案:

答案 0 :(得分:1)

你应该在GetFirstControl(ctrlItem)之后返回; 请尝试以下代码。

public bool GetFirstControl(Control ctrl)
    {
        foreach (Control ctrlItem in ctrl.Controls)
        {
            if (ctrlItem.HasChildren)
            {
                if(GetFirstControl(ctrlItem))
                {
                    return true;
                }
            }
            else if (ctrlItem is Control && ctrlItem.CanFocus && ctrlItem.TabStop && ctrlItem.Enabled && ctrlItem.Visible && ctrlItem.Size.Width > 0)
            {
                ctrlItem.Focus();
                return true;
            }
        }
        return false;
    }