2016-09-20 4 views
3
public delegate void MyEventHandler(object sender, DataGridViewCellEventArgs e); 
public event MyEventHandler SomethingHappened;  

private void dataGridViewCargo_CellContentClick_1(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex >= 0) 
    { 
     DataGridViewRow rowID = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplayMessageIdTextBox.Text = rowID.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 

     DataGridViewRow rowSender = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplaySubjectTextBox.Text = rowSender.Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 

    } 
} 



protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    Invoke(new MyEventHandler(SomethingHappened)); 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

最初の部分では、行を選択するとテキストボックスが更新されます。 2番目の部分は、イベントハンドラの試行です。キーボードでグリッドを移動するだけで、テキストボックスを更新したいと思っています。したがって、どの行が青色で強調表示されていても、自動的にテキストボックスが作成されます。矢印キーでDataGridViewを操作してテキストボックスを更新します。

イベントハンドラをdataGridViewCargo_CellContentClickに含めることで呼び出そうとしましたが、送信者とeが通過せず、パラメータカウントの不一致エラーが発生するか、インスタンスメソッドへの代理人にnullがありません。そのアイデアは、ボタンを押してCellContentClickイベントを呼び出すことでした。

非常に親切です。

+0

実際のコンテンツにヒットする必要があるため、CellContentClickは実際には悪い選択です。なぜあなたはProcessCmdKeyを持っていますか? dgvは、それが無効にされていない限り、すべてを処理する必要があります。 CurrentCellChangedイベントをコーディングするだけです! – TaW

答えて

2

DataGridViewの行の間を移動するためにマウスまたは矢印キーを使用すると、データソースの位置が変更され、同じデータソースにバインドされたすべてのコントロールに新しい位置の値が表示されます。

また、データバインディングを使用しない場合はというイベントが発生し、DataGridViewというイベントが発生し、コントロールの更新に使用できます。

だから、問題を解決するために、これらのオプションのいずれかを使用することができます。

  • 結合するTextBoxコントロールをどのDataGridView使用するのと同じデータソースに。

  • イベントをDataGridViewとしてください。

あなたはDataSourceDataGridViewをバインドする場合は、あまりにもあなたのTextBoxコントロールのデータバインディングを使用することができます。これらのコントロールを、各行をクリックして表示するデータソースのフィールドにバインドするだけで十分です。あなたはデータバインディングを使用しない場合、あなたは、単にそれらのフィールドを見つけて、あなたを更新するDataGridViewSelectionChangedイベントを使用してDataGridViewCurrentRowプロパティを使用することができます

var data = GetDataFromSomeShere(); 
dataGridViewCargo.DataSource = data; 
cargoDisplayMessageIdTextBox.DataBindings.Add("Text", data, "ID"); 
cargoDisplaySubjectTextBox.DataBindings.Add("Text", data, "Subject"); 

:あなたはデータバインディングのデザイナーを使用したり、コードを使用して実行することができますTextBoxコントロール:

private void dataGridViewCargo_SelectionChanged(object sender, EventArgs e) 
{ 
    var row = dataGridViewCargo.CurrentRow; 
    cargoDisplayMessageIdTextBox.Text = 
     row.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 
    cargoDisplaySubjectTextBox.Text = 
     row .Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 
} 

データバインディング(最初のオプション)を使用することをお勧めします。

+0

ありがとうございます。私は提案されたデータバインディングメソッドを使用しましたが、SelectionChanged代替を使用しようとしましたが、プライベートvoid dataGridViewCargo_SelectionChanged(オブジェクト送信者、EventArgs e)を記述すると、dataGridViewCargoへの参照を持たないようです。それがなぜ起こっているのか知っていますか? – Connor

+1

ようこそ。 2番目のオプションでは、コードまたはデザイナを使用してイベントハンドラをイベントにアタッチすることを忘れないようにしてください。また、メソッドにグリッドが表示されているスコープにイベントハンドラを書き込むようにしてください。 –

関連する問題