2012-01-14 7 views
1

Windowsフォームアプリケーションでは、同じタイプのさまざまなコントロールをさまざまなフォームで使用して、特定のイベントに常に対応させたいものがいくつかあります。たとえば、TextBox型のDataGridViewCellを1回クリックするだけで、自動的に編集モードに入るようには読み込まれません。単純なイベントハンドラのコードは、dgvParmsと呼ばれるのDataGridViewをフォーム上のこのような場合には、次のとおりです。一般的なイベントハンドラを収集するために静的クラスを使用するのはよいですか?

private void dgvParms_CellClick(object sender, DataGridViewCellEventArgs e) { 
    DataGridViewCell c = dgvParms[e.ColumnIndex, e.RowIndex]; 
    if (!c.ReadOnly && c is DataGridViewTextBoxCell) { 
     dgvParms.CurrentCell = c; 
     dgvParms.BeginEdit(true);     
    } 
} 

私は簡単に私の個々の形Loadハンドラで、その後CommonEventsを言う、静的クラスにこのメソッドを移動し、可能性があり静的メソッド定義をそれぞれのDataGridViewのCellClickイベントに割り当てます。

this.dgvParms.CellClick += CommonEvents.dgvEditOnCellClick; 

これは容認できますか、それとも良い方法ですか?または、消費するフォームのコードごとにイベントハンドラロジックを保持することが望ましいですか?もちろん、あなたがあなたのコードを変更する必要がありますが、私はもちろん、これは私には絶対に正常に見える

this.dgvParms.CellClick += (a, b) => CommonEvents.dgvEditOnCellClick(a, b); 

答えて

2

ような、共通メソッドを呼び出すローカルイベントハンドラを定義することにより、間に何か(ただし、冗長)を、行うことができますイベントを発生させたDataGridViewを見つけるためにsender引数を使用します

private void dgvParms_CellClick(object sender, DataGridViewCellEventArgs e) { 
    DataGridView dgvParams = sender as DataGridView; 
    DataGridViewCell c = dgvParms[e.ColumnIndex, e.RowIndex]; 
    if (!c.ReadOnly && c is DataGridViewTextBoxCell) { 
     dgvParms.CurrentCell = c; 
     dgvParms.BeginEdit(true);     
    } 
} 

取り扱い、そのイベントに反応させることによって、コントロールに動作を変更したり、追加の一般的なアプローチはattached behaviourと呼ばれています。これはWPFで最も一般的に使用されますが、WinFormsでもそれを使用するのに間違いはありません。

+0

'dGvParams!= null'が' sender as DataGridView'の割り当ての後であることを確認してください。 –

+0

@ JasonDownこれは必須ではありません。このメソッドは、DGVを送信者引数として渡すイベントにのみ割り当てることができます。イベントが動作する方法は、このメソッドがnull送信者では呼び出されないことを意味します。 – ColinE

+0

習慣の力...メソッドparmsが '(オブジェクト送信者、EventArgs e)'であれば、チェックを実行するだけで済みます。これは、メソッドをイベントハンドラとして委譲できることを意味します。 –

6

あなたはDataGridViewのから継承し、この、あなたが必要とする他の特殊な動作を追加することによって、独自のカスタマイズのDataGridViewを定義してみてください。私はこの時点で以下のコードをテストすることはできませんが、私はそれが正しいと信じている:

public class MyDgv : DataGridView 
{ 
    protected override void OnCellClick(DataGridViewCellEventArgs e) 
    { 
     DataGridViewCell c = this[e.ColumnIndex, e.RowIndex]; 
     if (!c.ReadOnly && c is DataGridViewTextBoxCell) 
     { 
      this.CurrentCell = c; 
      this.BeginEdit(true); 
     } 
    } 
} 

あなたがこれを行うにはないいくつかの理由があるかもしれませんが、ご自分のDGVコントロールのすべてで、この特定の動作のような場合は、カスタム実装を使用してください。

+0

これは、イベントハンドラの一般的なセットよりもはるかに優れたソリューションです... –

関連する問題