2013-05-27 14 views
8

Ich muss eine Zeile in dataGridView mit einem Rechtsklick auswählen, bevor ContextMenu angezeigt wird, da contextMenu row-dependendt ist.Klicken Sie mit der rechten Maustaste, um eine Zeile in dataGridView auszuwählen

Ich habe dies versucht:

if (e.Button == MouseButtons.Right) 
     { 

      var hti = dataGrid.HitTest(e.X, e.Y); 
      dataGrid.ClearSelection(); 
      dataGrid.Rows[hti.RowIndex].Selected = true; 
     } 

oder:

private void dataGrid_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      dataGrid.Rows[e.RowIndex].Selected = true; 
      dataGrid.Focus(); 
     } 
    } 

Das funktioniert aber wenn ich versuche dataGrid.Rows [CurrentRow.Index] Ich sehe nur die Zeile mit links ausgewählt zu lesen klicken Sie auf und nicht diejenigen mit der rechten Maustaste ausgewählt ..

Antwort

22

Versuchen Sie, setzen Sie die aktuelle Zelle wie folgt (dies wird die CurrentRow Eigenschaft der DataGridView vor dem Kontext Männer setzen u Artikel ausgewählt ist):

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      // Add this 
      dataGrid.CurrentCell = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
      // Can leave these here - doesn't hurt 
      dataGrid.Rows[e.RowIndex].Selected = true; 
      dataGrid.Focus(); 
     } 

    } 
+0

Dank, das funktioniert. – user2396911

+0

Gern geschehen! – Gjeltema

2

Ich weiß, dieser Thread alt ist, ich wollte nur eine Sache hinzufügen: Wenn Sie in der Lage sein wählen wollen, und die Aktion ausführen, auf mehrere Zeilen: Sie überprüfen können, Prüfen Sie, ob die Zeile, auf die Sie rechtsklicken, bereits ausgewählt ist. Auf diese Weise verhält sich DataGridview in dieser Hinsicht wie ein ListView. Klicken Sie also mit der rechten Maustaste auf eine Zeile, die noch nicht ausgewählt ist: Wählen Sie diese Zeile aus und öffnen Sie das Kontextmenü. Wenn Sie mit der rechten Maustaste auf eine bereits ausgewählte Zeile klicken, wird das Kontextmenü geöffnet und die ausgewählten Zeilen wie erwartet beibehalten.

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.RowIndex != -1 && e.ColumnIndex != -1) 
     { 
      if (e.Button == MouseButtons.Right) 
      { 
       DataGridViewRow clickedRow = (sender as DataGridView).Rows[e.RowIndex]; 
       if (!clickedRow.Selected) 
        dataGridView1.CurrentCell = clickedRow.Cells[e.ColumnIndex]; 

       var mousePosition = dataGridView1.PointToClient(Cursor.Position); 

       ContextMenu1.Show(dataGridView1, mousePosition); 
      } 
     } 
    } 
0
private void grid_listele_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      grid_listele.ClearSelection(); 
      grid_listele[e.ColumnIndex, e.RowIndex].Selected = true; 
     } 


    } 
+0

Können Sie eine Erklärung hinzufügen, warum das Beispiel des OP nicht funktioniert hat und was Sie getan haben? – Yogesh

0
if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      var hti = GridView.HitTest(e.X, e.Y); 
      GridView.ClearSelection(); 

      int index = hti.RowIndex; 

      if (index >= 0) 
      { 
       GridView.Rows[hti.RowIndex].Selected = true; 
       LockFolder_ContextMenuStrip.Show(Cursor.Position); 
      } 

     } 

Diese genaue Methode ist Ich denke,

Verwandte Themen