Wie wählen Sie eine Datagridview-Zeile bei einem Rechtsklick aus?Klicken Sie mit der rechten Maustaste, um eine Datagridview-Zeile auszuwählen
Antwort
// 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;
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
Sie können JvR den Code in das Ereignis Mousedown des Datagridview verwenden.
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;
}
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];
}
}
Das hat gut für mich funktioniert, danke! – Superbeard
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
Sie haben zwei Dinge zu tun:
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 diesenWenn 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 SieMe.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
dies wird wirklich langsam, wenn die Menge der Zeilen zu tun ist hoch ... – karlipoppins
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
Kann .ClearSelection nicht helfen, Dinge zu beschleunigen? – ccalboni