2008-10-06 11 views

Antwort

15
// Clear all the previously selected rows 
    foreach (DataGridViewRow row in yourDataGridView.Rows) 
    { 
     row.Selected = false; 
    } 

    // Get the selected Row 
    DataGridView.HitTestInfo info = yourDataGridView.HitTest(e.X, e.Y); 

    // Set as selected 
    yourDataGridView.Rows[info.RowIndex].Selected = true; 
+3

dies wird wirklich langsam, wenn die Menge der Zeilen zu tun ist hoch ... – karlipoppins

+2

Wenn Ihr Datagridview hat Multiselect auf false gesetzt dann die vorherige Auswahl Löschen ist unnötig. Außerdem kann HitTestInfo HitTestInfo.Nowhere zurückgeben, wenn der Treffer keine gültige Zeile/Spalte ist. – stuartd

+0

Kann .ClearSelection nicht helfen, Dinge zu beschleunigen? – ccalboni

5

die coole Sache ist, ein Menü auf diesem Rechtsklick hinzufügen, zum Beispiel mit der Option wie „View Client-Informationen“, „letzte Rechnungen überprüfen“, „In dieses Client einen Protokolleintrag“ usw.

Sie müssen nur ein ContextMenuStrip-Objekt hinzufügen, fügen Sie Ihre Menüeinträge hinzu, und wählen Sie in den DataGridView-Eigenschaften einfach den ContextMenuStrip aus. war zu bekommen, was Reihe

Dies würde ein neues Menü in der Zeile erstellen der Benutzer direkt mit allen Optionen geklickt hat, dann zu tun alles, was Sie brauchen, ist Ihre Magie machen :)

daran erinnern, dass Sie JvR Code benötigen die Benutzer in, dann greifen Sie die Zelle, die die Client-ID zum Beispiel enthält, und übergeben Sie diese Information.

hoffen, dass es Ihre Anwendung hilft Verbesserung

http://img135.imageshack.us/img135/5246/picture1ku5.png

http://img72.imageshack.us/img72/6038/picture2lb8.png

0

Sie können JvR den Code in das Ereignis Mousedown des Datagridview verwenden.

3

Subclass die DataGridView und erstellen Sie ein MouseDown Ereignis für das Netz,


private void SubClassedGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Sets is so the right-mousedown will select a cell 
    DataGridView.HitTestInfo hti = this.HitTest(e.X, e.Y); 
    // Clear all the previously selected rows 
    this.ClearSelection(); 

    // Set as selected 
    this.Rows[hti.RowIndex].Selected = true; 
} 
17

es ähnlich wie bei der linken Maustaste verhalten? z.B.

private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     dataGridView.CurrentCell = dataGridView[e.ColumnIndex, e.RowIndex]; 
    } 
} 
+0

Das hat gut für mich funktioniert, danke! – Superbeard

+3

Dies ist flexibler und vollständiger als die Antwort von JvR, aber Sie sollten eine Überprüfung für 'e.ColumnIndex> = 0 &&.RowIndex> = 0 'hinzufügen, wenn der Benutzer mit der rechten Maustaste auf eine Kopfzeile klickt. – Chad

0

Sie haben zwei Dinge zu tun:

  1. Löschen Sie alle Zeilen und die aktuelle auswählen. I Schleife durch alle Zeilen und verwenden Sie die Bool Expression i = e.RowIndex für diesen

  2. Wenn Sie Schritt getan hat 1 Sie immer noch eine große Gefahr haben:
    DataGridView1.CurrentRow nicht zurück Ihre zuvor ausgewählte Zeile (was sehr gefährlich ist). Da CurrentRow Read-Only ist haben Sie

    Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex)

    Protected Overrides Sub OnCellMouseDown(
        ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 
    
        MyBase.OnCellMouseDown(e) 
    
        Select Case e.Button 
         Case Windows.Forms.MouseButtons.Right 
          If Me.Rows(e.RowIndex).Selected = False Then 
           For i As Integer = 0 To Me.RowCount - 1 
            SetSelectedRowCore(i, i = e.RowIndex) 
           Next 
          End If 
    
          Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex) 
        End Select 
    
    End Sub