2

私は C# winforms プロジェクトで作業しており、ツール ストリップ メニューからの選択時に読み込まれるユーザー コントロールがあります。他の機能のために、ユーザー コントロールのフォーム ロード時に発生する辞書ルックアップを設定しています。また、ユーザー コントロールを閉じるときは、「.Hide();」を使用しているだけです。方法。最初にユーザーコントロールをロードするとすべて問題ありませんが、2回目に閉じて再度開くと、オブジェクトの新しいインスタンスが作成されるため、辞書検索がスローされます。したがって、問題を解決するためにいくつかのコードを書きました。

私がしなければならないことは、ユーザー コントロールのインスタンスが既に存在する場合は、そのオブジェクトの新しいインスタンスを作成しないということです。代わりに、ユーザー コントロールを再び表示できるようにします。したがって、この目的を達成するためにコードを書きました。初めてアイテムを選択したときは、すべて問題ありません。ユーザー コントロールを非表示にして再度開こうとしても、何も起こりません。

以下は、ツール ストリップ メニューから項目を選択したときに発生する、この目的のために作成したコードです。

      if (Controls.ContainsKey("CheckAvailUserControl"))
       {
           Controls["CheckAvailUserControl"].Dock = DockStyle.Fill;
           Controls["CheckAvailUserControl"].Visible = true;
           Controls["CheckAvailUserControl"].Show();
           Controls["CheckAvailUserControl"].Refresh();
       }

       else
       {
          UserControl checkAvailUserControlLoad = new CheckAvailUserControl();
          Controls.Add(checkAvailUserControlLoad);
          checkAvailUserControlLoad.Dock = DockStyle.Fill;
          checkAvailUserControlLoad.Visible = true;
          checkAvailUserControlLoad.Show();
       }

デバッガーでコードをトレースすると、実際には上記の if/else ステートメントの正しい部分にヒットしています。2回目にロードしようとしたときに、ユーザーコントロールが画面に表示されないだけです。

問題は、ユーザー コントロールを閉じてからツール ストリップ メニューから再度選択した後、ユーザー コントロールを正しく読み込むにはどうすればよいかということです。

4

3 に答える 3

9

Controls.ContainsKey(...) は、作成時にコントロールに名前を割り当てなかったため、常に false を返していると思います。

コントロールを作成するときに、

//...
checkAvailUserControlLoad.Name = "Something"
//...
Controls.Add(checkAvailUserControlLoad);

それから

Controls.ContainsKey("Something") 

true が返され、次を使用してコントロールを再利用できるようになります。Controls["Something"]

于 2009-02-23T19:25:17.983 に答える
2

どうぞ:

private void button_Click(object sender, EventArgs e)
{
    // pass in the containing panel
    LoadControl<MyControls.MyControl>(panelContainer);
}

void LoadControl<T>(Panel panel) where T : Control, new()
{
    T _Control = GetControl<T>(panel);
    if (_Control == null)
    {
        _Control = new T();
        _Control.Dock = DockStyle.Fill;
        panel.Controls.Add(_Control);
    }
    _Control.BringToFront();
}

T GetControl<T>(Panel panel) where T : Control
{
    Type _Type = typeof(T);
    String _Name = _Type.ToString();
    if (!panel.Controls.ContainsKey(_Name))
        return null;
    T _Control = panel.Controls[_Name] as T;
    return _Control;
}
于 2010-02-03T22:12:30.480 に答える
1

これは機能する可能性がありますが、少し逆だと思います。古いコードを移動することで解決できる問題に新しいコードを投げかけているのです。

代わりに、イベントがフォームでどのように機能するかを考えてください。作成中のコードをわずかに異なるイベントに移動するか、後でイベントが発生したことを検出してそれらを無視すると、問題をより適切な方法で修正できると思います。

于 2009-02-23T19:38:36.453 に答える