2013-05-27 15 views
8

Muszę wybrać wiersz w dataGridView prawym przyciskiem myszy przed wyświetleniem ContextMenu, ponieważ contextMenu zależy od wiersza.Kliknij prawym przyciskiem myszy, aby wybrać wiersz w danychGridView

Próbowałem to:

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

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

czyli

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

To działa, ale gdy próbuję czytać dataGrid.Rows [CurrentRow.Index] Widzę tylko wybrany wiersz z lewej kliknij, a nie te wybrane za pomocą kliknięcia prawym przyciskiem myszy.

Odpowiedz

22

Spróbuj ustawić bieżącą komórkę w ten sposób (to ustawi wartość CurrentRow właściwości DataGridView przed kontekstem mężczyzn U pozycja jest zaznaczona):

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

Dzięki, to działa. – user2396911

+0

Nie ma za co! – Gjeltema

2

Zdaję sobie sprawę, ten wątek jest stary, chciałem tylko dodać jedną rzecz: Jeśli chcesz, aby być w stanie wybrać i wykonywać działania na wielu wierszy: można sprawdzić, zobacz, czy wiersz, który kliknąłeś prawym przyciskiem, jest już zaznaczony. W ten sposób zachowuje się DataGridview lubi ListView w tym zakresie. Kliknięcie prawym przyciskiem myszy na wiersz, który nie został jeszcze wybrany: wybiera ten wiersz i otwiera menu kontekstowe. Kliknięcie prawym przyciskiem myszy już wybranego wiersza powoduje wyświetlenie menu kontekstowego i zachowanie wybranych wierszy zgodnie z oczekiwaniami.

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

Czy możesz dodać wyjaśnienie, dlaczego przykład OP nie działa i co zrobiłeś? – 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); 
      } 

     } 

Jest to dokładna metoda Chyba

Powiązane problemy