0

フォームと複数のコントロールがあります。

単一のフォームがあり、いくつかのコントロールが含まれている必要があるとします。

単一のフォームで作業し、いくつかのユースケースに応じてコントロールを追加および削除しようとしています。

たとえば、これは私のフォームクラスのサンプルコードです。

private void AddToControlPanel(UserControl control)
        {
            this.panelControl.Controls.Add(control);
            this.panelControl.Tag = control;
            this.panelControl.Size = control.Size;
            this.panelControl.Dock = DockStyle.Fill;
            control.Show();
        }

上記のサンプルは、いくつかのパネルにコントロールを追加し、それを示しています。

問題は、他のコントロールを追加して現在のコントロールを削除することができないことです。たとえば、一部のログインコントロールが正常に認証された場合、ログインコントロール自体を削除し、検索ボックスコントロールのように他のログインコントロールを表示します。

どうすればそれを達成できますか?

これは私がこれまでに試したことです:

if (LoginOK)
{
   //Add the next Control I want to load
   this.ParentForm.Controls.Add(new CtlPedirDevolucion());
   //Remove this actual control
   this.ParentForm.Controls.Remove(this);
}

...後で、イベントハンドラーを使用して最新の追加コントロールを表示します。

private void FirstForm_ControlRemoved(object sender, ControlEventArgs e)
{
    this.Controls[this.Controls.Count - 1].Show();
}

しかし、これは私にはうまくいきません。さらに、私は自分のアプローチが好きではありません。

これを達成するためのより良い方法を教えていただけますか?

4

1 に答える 1

1

私は似たようなことを試しましたが、うまくいきました。

フォームのコード:

public void SwitchControls(Control removeCtrl, Control addControl)
{
     panel1.Controls.Remove(removeCtrl);
     panel1.Controls.Add(addControl);
}

コントロールのコード:

MyForm frm = (MyForm)this.FindForm();
CtlPedirDevolucion newCtrl = new CtlPedirDevolucion();
newCtrl.Dosck = DockStyle.Fill;
frm.SwitchControls(this, newCtrl);

編集:私の悪い、削除されるコントロールでCtlPedirDevolucionを作成する意味はありません。フォームでインスタンス化する必要があり、それへの参照もある必要があります。したがって、SwitchControlsには、より複雑なロジックと、おそらくより多くのパラメーターが必要ですが、これは操作できるものです。たぶん、フォーム内にコントロールを作成するスイッチケースなどを作成できます。これは単なる例ですが、非常に悪いことを思い出してください。

于 2012-10-21T21:00:24.720 に答える