イベントとメソッドを区別する必要があります。仮想として宣言されていない場合、イベントをオーバーライドすることはできません。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番目の箇条書きを使用し、イベントハンドラーがロードしたリストをカスタマイズできるようにします。
より大きな問題を混同しないようにしようとすると、これは間違っています。リストはフォームコンストラクターで初期化する必要があります。