Nur bestimmte Werte aus DataBinding anzeigen, die Regel erfüllen

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Nur bestimmte Werte aus DataBinding anzeigen, die Regel erfüllen

    Hallo,
    ich befülle ein DataSet, welches an eine ComboBox gebunden ist. Nun möchte ich, dass nur die Werte mit in der ComboBox angezeigt werden,
    die eine bestimmte Bedingung erfüllen. In meinem Fall sehen die Rows ungefähr so aus:

    Quellcode

    1. Name : Anderes_Dt_Row
    2. "Blabla" : Anderes_Dt(index)
    3. "" : Anderes_Dt(index)
    4. "" : Anderes_Dt(index)
    5. "Blabla2": Anderes_Dt(index)

    Es sollen quasi die Rows angezeigt werden, bei denen der Name nicht String.Empty gleicht.

    Wie mach ich das auf eleganteste Art und Weise?

    MfG Tim
    Mit einem BindingSource.Filter

    VB.NET-Quellcode

    1. 'Alle Datensätze wo in Spalte Name und/oder BlaBla ein String.Empty ist werden nicht angezeigt.
    2. BindingSource.Filter = String.Format("Name <> '{0}' AND BlaBla <> '{0}'", String.Empty)


    Dann würde ich eine DataView nehmen, diese hat auch einen Filter. Dazu DataSource und DisplayMember der ComboBox setzen.

    VB.NET-Quellcode

    1. Using f As New Form2
    2. Using d As New DataView(Ds.Dt)
    3. d.RowFilter = String.Format("Name <> '{0}'", String.Empty)
    4. f.ComboBox1.DataSource = d
    5. f.ComboBox1.DisplayMember = "Name"
    6. f.ShowDialog()
    7. End Using
    8. End Using


    Edit: @Fortender Nachdem der Dialog beendet wurde sollte noch BindingSource.ResetBindings(False) aufgerufen werden, könnte sonst passieren das Änderungen nicht angezeigt werden.

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

    Stimmt.
    Btw:
    Gibt es eine Möglichkeit, das Dataset zu "clearen" sodass auch die Nummerierung wieder beim Seed beginnt?
    Wenn ich Dt.Clear() benutze und das Dataset wieder neu lade, dann geht es beim letzten Index weiter und nicht wieder beim Seed.

    MfG Tim
    Bei mir funktioniert's so:

    VB.NET-Quellcode

    1. Private Sub ResetDataSetContent(ds As DataSet)
    2. ds.Clear()
    3. For Each dt As DataTable In ds.Tables
    4. dt.Columns(0).AutoIncrementStep = -1
    5. dt.Columns(0).AutoIncrementSeed = -1
    6. dt.Columns(0).AutoIncrementStep = 1
    7. dt.Columns(0).AutoIncrementSeed = 0
    8. Next
    9. End Sub


    MfG Tim
    Ich arbeite mit typisierten datasets.
    Nur ist das gerade wohl ein Spezialfall..
    Ich benötige die ID zur Anzeige im DGV. Wenn ich dem user ermöglichen möchte ein neues Projekt zu erstellen, muss alles resettet werden. Dabei muss die ID wieder beim Seed beginnen.

    MfG Tim
    also steht dir natürlich frei, AutoIncrement auf False zu setzen, und selbst die IDs zu generieren, wie du es für nötig hälst.
    Grad bei DatasetOnly ist das recht unproblematisch, denn der Client hat immer alle Daten geladen, und hat daher recht leicht die Möglichkeit, zuverlässig wirklich eindeutige IDs zu generieren.

    Nächstes Problem ist dann das Löschen von Projekten - vmtl. willste dann alle folgenden Datensätze umnumerieren - hmm, hmm.
    Geht auch, und da DataRelation.UpdateRule.Cascade eingestellt sein sollte, nimmt das die ForeignKeys auch mit.

    Aber wie gesagt: die reine Lehre der Datenbänkerei ist das nicht mehr,
    Nach der reinen Lehre stellt die ID nur die Identität dar, und darf nicht für sonstwelche Businesslogik "missbraucht" werden.
    Ich hab 3 Tables
    RamEntry, Asm und Cmd.
    RamEntry: ID|Hi[int]|Lo[int]|Asm[ASM_Row]
    ASM: ID|Name[string]|Cmd[Cmd_Row]
    Cmd: ID|Name[string]

    Es gibt IMMER 16 Einträge im Cmd table und 1000 Einträge im RamEntry table.
    Und will immer im dgv die RamEntry gelistet haben mit der Nummerierung 0-999.
    Der Rest soll selbsterklärend sein.

    MfG Tim
    also meinetwegen kannst du auch RamEntry.ID ganz weglassen, und mit DataRowCollection.Insert(), DataRowCollection.Romove(), DataRowCollection.RomoveAt() die RamEntryRows einfügen/entfernen, wie dus haben willst.

    Ein RAM ist ja eine sehr vergängliche Sache, daher könnte man die Ram-Tabelle auch einfach als eine temporäre ansehen.