Im Datagridview/dataset bei einer checkbox wenn eine true alle anderen automatisch auf false setzen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Im Datagridview/dataset bei einer checkbox wenn eine true alle anderen automatisch auf false setzen

    Hallo Leute,

    wie in der überschrift erwähnt möchte ich in einem Datagridview/Dataset eine Spalte ähnlich eines RadioButton nutzen. D.h. wenn man in einer Zeile den Wert auf true setzt sollen alle anderen auf false gesetzt werden.

    Ich hab im Moment keine Idee wie ich dies realisieren soll...stehe auf'm Schlauch

    Danke
    dazu musst du die geeigneten Datatable-Events verarbeiten und listenreichen Code schreiben, der alle Rows durchsucht, und an geeigneter Stelle manipuliert.
    Genaueres kann ich nicht sagen - kommt ja auf deine DataTable an - wie die designed ist.

    Hier mal Sample, wie vergleichbares im DbGenerator an einer typisierten DataTable vom Typ MappingDataTable gelöst ist:

    VB.NET-Quellcode

    1. Private WithEvents _Active As MappingDataTable = Me
    2. Public ReadOnly EventDisabler As New ActionFrame(Sub() _Active = Nothing, Sub() _Active = Me)
    3. Private Sub _Active_ColumnChanged(sender As Object, e As DataColumnChangeEventArgs) Handles _Active.ColumnChanged
    4. If e.Row.RowState = DataRowState.Detached OrElse e.Column IsNot PreferredColumn Then Return
    5. Dim rw = DirectCast(e.Row, MappingRow)
    6. If rw.IsFwNameNull Then Return
    7. Using EventDisabler.Enter
    8. Dim fwName = rw.FwName
    9. ' unchecking Preferred-Property of the other MappingRows
    10. Call (From mp In rw.ProviderRow.GetMappingRows _
    11. Where mp.Preferred AndAlso Not mp.IsFwNameNull AndAlso mp.FwName = fwName AndAlso mp IsNot rw) _
    12. .ForEach(Sub(r) r.Preferred = False)
    13. End Using
    14. End Sub
    15. Private Sub _Active_ColumnChanging(sender As Object, e As DataColumnChangeEventArgs) Handles _Active.ColumnChanging
    16. If e.Row.RowState = DataRowState.Detached Then Return
    17. Dim rw = DirectCast(e.Row, MappingRow)
    18. If e.Column Is Me.PreferredColumn then e.ProposedValue = True 'only can click to checked - unchecking the others does _Active_ColumnChanged()
    19. End Sub
    _Active ist die MappingDataTable, und Preferred ist der SpaltenName einer Bool-Column, in der nur in einer Row True auftreten darf.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Super, genau das was ich suchte.
    Aber beim implementieren bekomme ich einige Fehler, wo ich nicht (mal wieder :wacko: ) weiter weiss.

    1. Problem

    VB.NET-Quellcode

    1. Public ReadOnly EventDisabler As New ActionFrame(Sub() _Active = Nothing, Sub() _Active = Me)


    woher kommt "ActionFrame"? Kennt mein VB nicht.

    2. Problem

    VB.NET-Quellcode

    1. Dim rw = DirectCast(e.Row, MappingRow)


    MappingRow?

    Vielen Dank
    Bei typisierten DataTables werden diverse Klassen generiert, und da hat also jeder seine eigenen typisierten DataTables - und hier im Sample heißt die halt MappingRow. Du hast doch nicht gedacht, du könntest das aus dem Zusammenhang reißen, bei dir einpasten, und würde laufen?
    Es ist nur eine grobe Richtlinie, die dir die Events aufzeigt, und wie man die Schleifen gestalten kann.
    Du kannst dir das ganze auch in Aktion angugge, im DbGenerator - da gibt es eine Checkbox-Spalte, wo von bestimmten Gruppen jeweils nur eine gecheckt sein kann.
    Also ich habe versucht das Ganze zu verstehen, aber mit deiner Unmenge an "Helferlein" ist das doch sehr undurchsichtig für den der sie nicht geschrieben hat.
    Ausserdem ist dies eine sehr kleine Tabelle, mehr eine Hilfstabelle, und deswegen habe ich das jetzt so gelöst:

    VB.NET-Quellcode

    1. Private Sub GolfYearDataGridView_RowValidating(sender As Object, e As DataGridViewCellCancelEventArgs) Handles GolfYearDataGridView.RowValidating
    2. Select Case CBool(GolfYearDataGridView.CurrentRow.Cells(2).Value)
    3. Case True
    4. Dim NumberRows As Integer = GolfYearBindingSource.Count - 1
    5. For i = 0 To e.RowIndex - 1
    6. GolfYearDataGridView.Rows(i).Cells(2).Value = False
    7. Next
    8. For i = e.RowIndex + 1 To NumberRows
    9. GolfYearDataGridView.Rows(i).Cells(2).Value = False
    10. Next
    11. End Select
    12. End Sub


    Und was meinst du? :D
    Bilder
    • Screenshot 2014-02-22 23.34.34.png

      6,08 kB, 289×461, 139 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TS71M“ ()