0

各ページがカスタム コントロールであるプログラムを作成しています。私が抱えている問題は、子コントロールがいつ閉じているかを親コントロールに判断させることができないことです。これは、子コントロールを呼び出すためのコードです。

    public void DisplayPanel(Control c)
    {
        Cursor = Cursors.WaitCursor;
        c.Dock = DockStyle.Fill;
        c.Show();
        c.ControlRemoved += new ControlEventHandler(OnChildClose);
        this.Controls.Add(c);

        c.BringToFront();
        Cursor = Cursors.Default;
    }

これがイベント ハンドラです。

    public void OnChildClose(object sender, EventArgs e)
    {
        MessageBox.Show("Child closed");
        ... rest of code to redraw listview... 
    }

子コントロールで、これは私がそれを終了する方法です:

        this.Parent.Controls.Remove(this);

それはすべて機能しますが、子コントロールが終了したら、リストビューを再描画する必要がありますが、上記のイベントは発生しません。これを行う他の方法はありますか?それとも別の方法で進める必要がありますか?

たとえば、子コントロールを使用してデータベースに何かを追加し、子を終了します。子コントロールは消え、親は画面に残りますが、親では何も更新されません。親コントロールを終了して、データベースへの追加を確認するために戻る必要があります

4

2 に答える 2

0

親リストから子を削除すると、すべてのイベントハンドラーも切断されるため、子が閉じられているという通知は届かないと確信しています(親のリストから子を削除すると、おそらく閉じられます)。 。

親リストから削除せず、削除しないようにすることができますDispose。または、子は親を更新する必要があることを知っているので、クライアントに親に自分自身を更新するように求めるメッセージを送信してもらいます。そうすれば、暗黙的なものに依存せず、何が起こっているのかを正確に知ることができます。

于 2012-07-15T05:20:30.170 に答える
0

子コントロールで次を定義しますevent

public delegate void RemovedEventHandler(object sender, EventArgs e);

class ChildControl
{
    ...

    public event RemovedEventHandler Removed;

    protected virtual void OnRemoved(EventArgs e)
    {
        if (Removed != null)
            Removed(this, e);
    }

    public void Remove(object value) 
    {
       // Before remove from parent call event 
       OnRemoved(EventArgs.Empty);
       //Here remove from parent
       ...
    }
}

親コントロールでの使用:

  ChildControl control = ...
  control.Removed += new EventHandler(ChildRemoved);


  // This will be called whenever the Child Removed:
  private void ChildRemoved(object sender, EventArgs e) 
  {
     ChildControl childControlThatRemoved = (ChildControl) sender;
     Console.WriteLine("This is called when the Child Removed.");
  }
于 2012-07-15T05:32:02.390 に答える