Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WinForms-循环所有控件以应用事件处理程序,而不是在SplitContainer中工作?_C#_Winforms_Loops_Controls - Fatal编程技术网

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

C#WinForms-循环所有控件以应用事件处理程序,而不是在SplitContainer中工作?,c#,winforms,loops,controls,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)

我有以下功能:

    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中循环?那么,我该如何着手修复它呢?我显然不希望有几个函数来执行这个(我认为)简单的任务


干杯。

假设问题在于您没有将事件分配给表单上的每个控件(仅顶级控件),那么解决方法应该是更改您的
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
事件处理程序。我希望这对你有用

另外,如果要将事件处理程序添加到所有控件,包括
父控件
控件,可以编写
setupFocusControls
方法,如下所示:

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

是否希望窗体上的每个控件都有该事件?还是仅仅是顶级的?如果需要每个控件,则需要使用递归将事件分配给每个控件。能否显示拆分容器窗体的
OnLoad
代码?是的,每个控件都需要此事件,因为我的帮助系统是基于每个控件配置的。i、 e.详细说明每个控件及其用途。我该怎么做呢?我在另一个窗体上有50多个控件,使用上面的方法它可以完美地工作。我认为它会很好地应用:(@lokisinlair看看我的答案。这有用吗?很好用。谢谢你,你是个明星!:)我喜欢简单的解决方法。