C#WinForms - 循环遍历所有控件以应用事件处理程序,而不是在SplitContainer中工作?

时间:2013-07-06 14:00:09

标签: c# winforms loops controls

我有这些功能:

    private void setupFocusControls(Control parent)
    {
        foreach (Control control in parent.Controls)
        {
            control.GotFocus += HandleFocus;
        }
    }

    private void HandleFocus(object sender, EventArgs e)
    {
        Control control = (Control)sender;
        thisFormName = this.Name;
        thisControlName = control.Name.ToString();


        if (bHelpSystemActive)
        {
            bHelpSystemActive = false;

            if ((ModifierKeys & Keys.Control) == Keys.Control)
            {
                HelpSystem hs = new HelpSystem(thisFormName, thisControlName);
                hs.ShowDialog();
            }
            else
            {
                showTooltipForControl(control, thisFormName);
            }


            return;
        }
    }

我在Form_Load函数中调用它:

    private void Labeller_Load(object sender, EventArgs e)
    {
        setupFocusControls(this);
        fillListBox();
    }

这样做是为了展示我写过的自定义帮助系统。如果没有单击控制键,那么我将在工具提示中显示信息。如果按下控制键,则显示编辑器。很简单。

现在,这段代码完全适用于另一种形式,它使用面板作为表单控件的容器。问题是,我现在想要将此功能添加到单独的表单中。我添加了所有代码,但表单上没有任何控件添加了HandleFocus事件。这个表单和工作表单之间的唯一区别是它使用splitContainer作为它的容器。

我的问题是,为什么setupFocusControls函数没有循环遍历splitContainer,因为它在我的工作表单上执行了面板操作?而且,我将如何修复它?我显然不会有几个函数来执行这个(我认为)简单的任务......

干杯。

1 个答案:

答案 0 :(得分:2)

假设问题是您没有将事件分配给表单上的每个单个控件(仅限顶级控件),则修复应该是更改setupFocusControls(Control)方法:

private void setupFocusControls(Control parent)
{
    foreach (Control control in parent.Controls)
    {
        control.GotFocus += HandleFocus;
        // add the following line to recurse throughout the control tree
        setupFocusControls(control);
    }
}

这将通过递归每个控件的子项,将HandleFocus事件处理程序添加到每个单个控件。我希望这适合你!

作为奖励,如果您要将事件处理程序添加到所有控件,包括 parent控件,您可以编写setupFocusControls方法,如下所示:

private void setupFocusControls(Control parent)
{
    parent.GotFocus += HandleFocus;
    foreach (Control child in parent.Children)
        setupFocusControls(child);
}