3 Stimmen

Legen Sie die Reihenfolge fest, in der Formularelemente durchlaufen werden.

Ich durchlaufe alle Steuerelemente auf einer bestimmten Registerkarte und greife dann auf die .tag-Eigenschaft von Kontrollkästchen zu, die ausgewählt sind.

Ich benötige jedoch, dass diese Steuerelemente in einer bestimmten Reihenfolge durchlaufen werden (ich hatte gehofft, dass sie nach Tab-Index sortiert wären), aber anscheinend sind sie das nicht.

Gibt es eine Möglichkeit, die Reihenfolge, in der sie durchlaufen werden, zu erzwingen? Vielen Dank.

Dim objCtrl As Control
For Each objCtrl In Me.objConfigForm.tabPageGeneral.Controls

    If TypeOf objCtrl Is CheckBox AndAlso DirectCast(objCtrl, CheckBox).Checked Then

        Dim strProp As String = DirectCast(objCtrl, CheckBox).Tag
        Dim strListItem As String = CallByName(objUser, strProp, CallType.Get)
        lstGeneral.Add(strListItem)

    End If

Next

4voto

Karl Anderson Punkte 34286

Verwenden Sie LINQ, um die Steuerelemente nach TabIndex zu sortieren, wie hier:

For Each objCtrl As Control In Me.Controls.Cast(Of Control).OrderBy(Function(c) c.TabIndex)
    If TypeOf objCtrl Is CheckBox AndAlso DirectCast(objCtrl, CheckBox).Checked Then
        Dim strProp As String = DirectCast(objCtrl, CheckBox).Tag
        Dim strListItem As String = CallByName(objUser, strProp, CallType.Get)
        lstGeneral.Add(strListItem)
    End If
Next

Hinweis: Der obige Code erfordert, dass der System.Linq Namespace in Ihre Code-Datei importiert wird, um die Cast() und OrderBy() LINQ-Erweiterungsmethoden zu unterstützen.

3voto

Joel Coehoorn Punkte 377088

Verwenden Sie die .OrderBy()-Erweiterung, um eine Reihenfolge auszuwählen. Außerdem können Sie den If-Block durch die Where()- und OfType()-Erweiterungen ersetzen, um die Verschachtelung und Typumwandlung zu reduzieren:

For Each box As CheckBox In Me.Controls.OfType(Of CheckBox)() _
                         .Where(Function(b) b.Checked) _
                         .OrderBy(Function(b) b.TabIndex)

    lstGeneral.Add(CallByName(objUser, box.Tag, CallType.Get))
Next

Update: Das ist etwas alt, aber es ist heute wieder in meinem Feed aufgetaucht, also wird es immer noch irgendwo von Google indexiert. Mit diesem Gedanken würde ich den Code heute eher so schreiben:

Dim selectedCheckboxNames = Me.Controls.
        OfType(Of CheckBox)().
        Where(Function(b) b.Checked).
        OrderBy(Function(b) b.TabIndex).
        Select(Function(b) CallByName(objUser, b.Tag, CallType.Get))
lstGeneral.AddRange(selectedCheckboxNames)

Eine der wichtigen Änderungen besteht darin, eine Variable für das Ergebnis der Linq-Abfrage einzuführen. Dies kann manchmal wertvolle Einblicke in den Code für zukünftige Entwickler bringen und hilft immer dabei, die For Each-Schleife einfacher zu lesen... vorausgesetzt, Sie konnten auch zu einem AddRange() konvertieren, wie ich es hier getan habe. Ich bin auch jetzt komfortabler damit, implizite Zeilenfortsetzungen und Option Infer zu nutzen.

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