3

フォームのメソッドをオーバーライドしたいShow()のですが、c#ではオーバーライドできません。前のウィンドウに戻ったときにリストボックスを更新するために実行したいと思います。オブザーバブルコレクションなどは使いたくない。

 protected override void Show() {
            base.Show();
            list.Items.Clear();
            loadListItems();
        }

'Sklep.OknoProduktow.Show()':継承されたメンバー'System.Windows.Forms.Control.Show()'は仮想、抽象、またはオーバーライドとしてマークされていないため、オーバーライドできません

4

3 に答える 3

12

Showメソッドをオーバーライドすることはできませんが、シャドウすることはできます。このコードを次の形式のクラスに配置します。

public new void Show()
{
     //your code here

     //call the shadowed Show method on our form.       
     base.Show();

}
于 2013-12-19T22:05:37.297 に答える
11

イベントメソッドを区別する必要があります。仮想として宣言されていない場合、イベントをオーバーライドすることはできません。Form.Shownイベントは仮想ではなく、保護されていません。

Winformsのイベント処理をオーバーライドするための別のメカニズムがあります。すべてのイベントXxxxには、OnXxxxという名前の対応する保護されたメソッドがあります。OnXxxx()メソッドの役割は、Xxxxイベントを発生させることであり、最終的には基本クラスの実装によって処理されます。この場合、Form.OnShown()によって。

この方法で行うことの価値は、イベントのデフォルトの処理をオーバーライドする方法に追加の選択肢があることです。

  • 最初にbase.OnShown()を呼び出してから、イベントをカスタマイズするために必要なことをすべて実行できます。これにより、カスタムイベントハンドラーが実行した可能性のあるものをすべてオーバーライドできます。OnPaintイベントハンドラーで一般的です。たとえば、ペイントしたものが、基本クラスまたはイベントハンドラーがペイントしたものの上にあることを確認したい場合です。
  • カスタマイズしたコードを記述してから、base.OnShown()を呼び出すことができます。反対の目標を達成します。カスタムイベントハンドラーは、ユーザーが行ったことをすべてオーバーライドできます。これは通常の方法です。
  • base.OnShown()を呼び出さに、カスタマイズしたコードを記述できます。これにより、イベントハンドラーがまったく実行されなくなります。これを行うことはめったにありませんが、カスタマイズが非常に広範囲であるため、クライアントコードのイベントハンドラーが誤動作する可能性がある場合に選択する必要があります。
  • base.OnShown()を呼び出さに、カスタマイズしたコードを記述できますが、Shownイベントを発生させることもできます。まれですが、基本実装が邪魔になる場合は、これを行う必要があります。

したがって、メソッドの最も可能性の高い正しい実装は次のとおりです。

    protected override void OnShown(EventArgs e) {
        loadListItems();
        //Call the original OnShown.
        base.OnShown(e);
    }

これは2番目の箇条書きを使用し、イベントハンドラーがロードしたリストをカスタマイズできるようにします。

より大きな問題を混同しないようにしようとすると、これは間違っています。リストはフォームコンストラクターで初期化する必要があります。

于 2013-01-20T14:56:36.340 に答える
4

アクティブ化されたイベントから使用してみませんか?

それはあなたを助けます。フォームがアクティブになると、リストボックスが更新されます。

私はあなたがオーバーライドすることはできないと思います、show()そしてこれがあなたの問題を解決しなかった理由です。

private void Form1_Activated(object sender, System.EventArgs e)
{
  list.Items.Clear();
  loadListItems();
}
于 2013-01-20T14:44:09.340 に答える