2016-11-15 27 views
1

My DataGridViewには〜200行が含まれ、それぞれにはユーザー情報(姓など)が含まれます。ユーザーがこれらの行のいずれかを選択すると、データベースを照会するために選択した行のIDを取得する必要があります。そのため、ユーザーが行を選択すると、IDが一致するまで全リストを繰り返し処理します。ここで私が話しているものを視覚化するためのコードです:行が選択された後に呼び出すDataGridViewイベント

if (e.RowIndex > -1) 
{ 
    int selectedId = Convert.ToInt32(dataGridView.Rows[e.RowIndex].Cells["IdColumn"].Value); 
    foreach (var user in Users) 
     if (user.Id == selectedId) 
     { 
      SelectedUser = GetUserById(user.Id); 
      break; 
     } 
} 

今、私はここで使用しているイベントがDataGridView.RowEnterでは、それが問題だリストは、このように、最初にロードされていても、このイベントが発生しますので、最低でも100回ループを実行してforeachループを実行します。
問題は、上記のコードが行が選択された後に一度だけ実行されるように、どのイベントを使用する必要がありますか?

+1

ドンデータをロードするまでイベントを接続しないでください。 – LarsTech

+0

これまでのところ、これは最高のオプションです。あなたが受け入れる答えとして投稿していないのは間違いです。 – user6807975

答えて

1

最も現実的な選択肢は、コメントに@LarsTechによって提案された:イベントを接続するすべてのデータがロードされた後にのみ。そして、私のデータがロードされた後にソートされているので、私はこのようにそれを実行:

private void dataGridView_Sorted(object sender, EventArgs e) 
    { 
     this.dataGridView.SelectionChanged -= new System.EventHandler(this.dataGridView_SelectionChanged); 
     this.dataGridView.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged); 
    } 

(私もイベントSelectionChangedRowEnterベースの代わりにベースにするために@Karthikによって提供されたコードを使用)

+1

'this.dataGridView.SelectionChanged - = this.dataGridView_SelectionChanged;'を最初に呼び出すか、グリッドがソートされるたびに複数のイベントハンドラを追加します。データが実際にグリッドに読み込まれると、実際にはハンドラをアタッチするのがベストです。 – LarsTech

1

ここでは問題の解決方法を示します。以下のイベントを使用して行を効果的に選択できます。理解を深めるためにコードに基づいて例を掲載しました。

例:

private void dataGridView_SelectionChanged(object sender, EventArgs e) 
    { 
    DataGridView gv = sender as DataGridView; 
    if (gv != null && gv.SelectedRows.Count > 0) 
     { 
     DataGridViewRow row = gv.SelectedRows[0]; 
     if (row != null) 
      { 
      if(Convert.ToInt32(row.Cells["IdColumn"].Value)==user.Id) 
       { 

         //do whatever we want 

       } 

      } 
     } 
    } 

は、それは確かに便利、親切に任意のさらなる明確化や疑問なら、私が知っているよう願っています。ハッピー共有

おかげ カルティク

+0

悲しいことに、最終結果は 'DataGridView.RowEnter'と同じです、' SelectionChanged'はリストを読み込むときに複数回起動されます初めて。 – user6807975

+0

@ user6807975ようやく解決策がありますか? –

1

カルティクElumalaiはちょうど最初得たが、ちょうど彼のソリューションを指摘する: あなたは

public event DataGridViewCellEventHandler RowEnter 

のDataGridViewが最初にロードされたときに、このイベントが発生し

を使用し、同様にユーザーが現在の行以外の行を選択したときと同じです。

msdn Documentation for rowenter

あなたが説明した動作は、このイベントがために作られたものだけです。 ですから、より良いカルティクElumalaiからの提案とそれを試してください:セルが選択されているか、選択がプログラムまたはユーザーアクションによってか、キャンセルされるたびに

public event EventHandler SelectionChanged 

このイベントが発生します。たとえば、このイベントは、現在選択されているセルの合計を表示する場合に便利です。

msdn Documentation for selectionchanged

関連する問題