4 Stimmen

Wie kann ich machen datagridview kann nur die Zellen in der gleichen Spalte zu einem Zeitpunkt auswählen?

Ich verwende Winforms, um meine Anwendung zu entwickeln. Und ich setze meine datagridview control's selectionmode zu "CellSelect", und dies erlauben dem Benutzer, so viele Zellen auszuwählen, wie er will, die über mehrere Spalten zu verbreiten; aber ich möchte meine Benutzer einschränken kann nur Zellen in einer einzigen Spalte zu einer Zeit, und es gibt nicht eine solche Art von selectionmode für mich.

Also, wenn ich dies implementieren möchte, wie kann ich die datagridview-Klasse erweitern? Ich denke auch, dass ich in eventhandler überprüfen kann, wenn die Auswahl Zellen geändert werden, durch die ich machen könnte der Benutzer kann nicht Zellen über mehrere Spalten verteilt auswählen, aber das ist nicht so gut, denke ich.

Kann mir jemand helfen, eine bessere Lösung zu finden?

1voto

AMissico Punkte 21179

Ihre Umsetzung ist in Ordnung. Das ist genau das, was ich gemacht habe. Ursprünglich habe ich versucht, mit den SetSelected...Core-Methoden umzugehen, aber die Details wurden zu umständlich. Ich habe mich für die folgende Lösung entschieden, weil sie 1) mit wenig Code auskommt, 2) nicht in anderen Code eingreift und 3) einfach ist.

Public Class DataGridView
    Inherits System.Windows.Forms.DataGridView

    Protected Overrides Sub OnSelectionChanged(ByVal e As System.EventArgs)
        Static fIsEventDisabled As Boolean

        If fIsEventDisabled = False Then

            If Me.SelectedCells.Count > 1 Then
                Dim iColumnIndex As Integer = Me.SelectedCells(0).ColumnIndex
                fIsEventDisabled = True
                ClearSelection()
                SelectColumn(iColumnIndex) 'not calling SetSelectedColumnCore on purpose
                fIsEventDisabled = False
            End If

        End If

        MyBase.OnSelectionChanged(e)

    End Sub

    Public Sub SelectColumn(ByVal index As Integer)
        For Each oRow As DataGridViewRow In Me.Rows
            If oRow.IsNewRow = False Then
                oRow.Cells.Item(index).Selected = True
            End If
        Next
    End Sub

End Class

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X