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 に答える