0

DataGridView から継承するコントロールを作成しています。私がやりたいことの 1 つは、CellFormatting イベントを処理せずに(そして自分で書式設定を行うことで)列の書式プロバイダーが使用されないというバグを処理することです。

「列フォーマットプロバイダーがあり、CellFormatting イベントハンドラーがない場合は、フォーマットを行う」という「OnCellFormatting」メソッドを作成すると思いました。

重要な部分 (私が思った) は、「...そして、CellFormatting イベント ハンドラーがありません」でした。

さて、過去にイベントでコントロールを書いたとき、私は次のようなことをしました:

  public event EventHandler SomethingHappened;

  protected void OnSomethingHappened(EventArgs e)
  {
     EventHandler handler = this.SomethingHappened;
     if (handler != null) handler(this, e);
  }

これは正常に機能し、このパターンがハンドラーがイベントにアタッチされているかどうかを判断し、そうである場合はそれらのハンドラーを呼び出すことを理解しています。十分に公平ですが、なぜこれができないのですか:

  protected void OnCellFormatting(EventArgs e)
  {
     EventHandler handler = this.CellFormatting;
     if (handler == null) DoSomething();
  }

エラーは、「イベント 'System.Windows.Forms.DataGridView.CellFormatting' は += または -=" の左側にのみ表示されます。

この (タイプの) イベントの違いは何ですか?

イベントの定義に移動して、独自のイベントを作成するとします。

パブリック イベント DataGridViewCellFormattingEventHandler CellFormatting2

...コンパイラはこれを私の「ハンドラー」変数に割り当てて喜んでいるので、私の質問は、CellFormattingイベント(および、他の多くのイベント)と何が違うのか、それに対するイベントハンドラーがあるかどうかを判断できないことです?

ありがとう、ロス

4

2 に答える 2

0

これは、読み取り専用であるため、割り当てを実行できないことを示しています。ハンドラーをプライベートに宣言してみてはいかがでしょうか?

于 2012-04-30T09:26:19.007 に答える
0

イベントを宣言するクラスのみが、イベントに完全にアクセスできます。

たとえば、派生クラスであっても、他のクラスからイベントを呼び出すことはできません。

から派生しているため、この状況にありますDataGridView


リフレクションを使用できる場合があります。

.NET (c#) でリフレクションを介してイベントを発生させるにはどうすればよいですか?

MSDN: Type.GetEvent メソッド

于 2012-04-30T09:23:41.067 に答える