0

我有这些功能:

    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 ?而且,我将如何解决它?我显然宁愿没有几个功能来执行这个(我认为的)简单任务......

干杯。

4

1 回答 1

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);
}
于 2013-07-06T14:04:52.680 回答