2017-01-18 5 views
0

Ich arbeite an einem neuen Projekt, das eine mehrzeilige Auswahl/Abwahl durch den Benutzer in einer Datagridview mit nur einem Tippen auf einen Touchscreen benötigt.Mehrfachauswahl in Datagridview

Das Formular sollte wie folgt aussehen:

Form Screenshot http://117.imagebam.com/download/PBhJJNednkL1q0JzMF8j_g/52716/527152884/test%20lecture%20scanner.PNG

Für exemple, wenn der Benutzer Zeile 2 und 5 löschen will, er muss nur einmal tippen Sie auf jeder Zeile, sie zu aktivieren/deaktivieren. Nachdem die Auswahl abgeschlossen ist, tippe er auf "Delete Row".

Ich habe schon versucht, mit dem CellClick Event ohne Erfolg zu spielen !!

Kann jemand eine Ahnung wie kann ich mit diesem Problem umgehen?

+2

, die typischerweise eine Funktion der durch Halten CTRL normales Verhalten und getan wäre, wie Sie die Zeilenköpfe Grids links klicken. Eine Rastereigenschaft steuert wahrscheinlich den Auswahltyp. – DonBoitnott

+0

Da für den Operator keine Tastatur vorhanden ist, möchte ich eine Funktion, die die CTRL-Taste "emuliert"! – Boushard

Antwort

1

Nach der Einstellung MultiSelect Eigenschaft auf True und SelectionMode-FullRowSelect können Sie eine List verwenden zu speichern, welche Zeile Ihres DataGridView ausgewählt ist.

Auf CellClick Sie hinzufügen können/entfernen Zeilen aus List, auf RowPostPaint Sie eine Zeile auswählen können, wenn sie in der List und auf RowsRemoved enthalten ist haben Sie die List löschen.

Private intSelectedRows As New List(Of Integer) 

Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick 

    With CType(sender, DataGridView) 

     Dim intRow As Integer = .CurrentRow.Index 

     If Not Me.intSelectedRows.Contains(intRow) Then 
      Me.intSelectedRows.Add(intRow) 
     Else 
      .CurrentRow.Selected = False 
      Me.intSelectedRows.Remove(intRow) 
     End If 

    End With 

End Sub 

Private Sub DataGridView1_RowPostPaint(sender As Object, e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint 

    If Me.intSelectedRows.Contains(e.RowIndex) Then 
     CType(sender, DataGridView).Rows(e.RowIndex).Selected = True 
    End If 

End Sub 

Private Sub DataGridView1_RowsRemoved(sender As Object, e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles DataGridView1.RowsRemoved 

    Me.intSelectedRows.Clear() 

End Sub 

Wenn Sie Auswahl löschen Sie diesen Code verwenden können:

Private Sub btnClearSelectedRows_Click(sender As System.Object, e As System.EventArgs) Handles btnClearSelectedRows.Click 

    For Each intSelectedRow As Integer In Me.intSelectedRows 
     Me.DataGridView1.Rows(intSelectedRow).Selected = False 
    Next intSelectedRow 

    Me.intSelectedRows.Clear() 

End Sub 
+0

Arbeit wie ein Charme! Genau nach was ich suche! Vielen Dank @tezzo – Boushard

+0

Nur etwas mehr getestet, aber ich laufe auf ein Problem. Wenn ich die mit dieser Methode getroffene Auswahl löschen möchte, wie kann ich fortfahren, außer auf alle bereits ausgewählten Zeilen zu klicken? Ich habe versucht, klarselektioniert, aber ohne Erfolg. – Boushard

+0

Antwort aktualisiert! – tezzo