Wie am besten mehrere Datensätze in Controls anzeigen?

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Wie am besten mehrere Datensätze in Controls anzeigen?

    Hallo,

    ich habe eine DataTable, in der es unter anderen "ValueTitle" und "Value" gibt, beide Strings.

    Je nach Ablauf des Programms muss unterschiedliche Anzahl an Datensätzen gleichzeitig angezeigt werden. "ValueTitle" in einem Label und daneben "Value" in einer Textbox.
    Wie kann man es am besten automatisieren, dass Label und TextBox immer zusammenhängend angesprochen werden und die nicht benötigten ausblendet werden? Mit Bindingsource kann man es ja nicht machen, weil es mehrere Datensätze gleichzeitig sind, oder? Ich kann alle beteiligten Datensätze von einer übergeordneten Tabelle mit .GetValueRows() holen, das ist kein Problem.
    DGV kommt an dieser Stelle aus optischen Gründen nicht in Frage, es soll schon ein DetailView werden (einzelne Controls für einzelne Werte), aber eben mehrere gleichzeitig.

    Ich habe mir überlegt, jeweils Groupboxen für Label+Textbox anzulegen, damit ich sie in der Schleife durchlaufen kann, und von oben nach unten die Controls darin beschreiben, bis die ValueRows alle durch sind. Kann man es irgendwie auch anders machen?

    Sie sollen alle untereinander sein (je Label und Textbox daneben, dann wieder ein Paar weiter unten usw) und optisch voneinander nicht abgetrennt sein.

    Danke.

    sonne75 schrieb:

    "ValueTitle" in einem Label und daneben "Value" in einer Textbox.
    Da könntest Du ein UserControl draus basteln.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Projekt -> Hinzufügen -> Benutzersteueerelement
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gib dem Ding entsprechende Properties
    und
    mach eine List(Of ...)

    VB.NET-Quellcode

    1. ucValue(0).ValueTitle = "bla"
    2. ucValue(0).Value = 17
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Meinst du so?

    VB.NET-Quellcode

    1. Public Class ucValue
    2. Private _ValTitle As String
    3. Private _Val As String
    4. Public Property ValTitle() As String
    5. Get
    6. Return _ValTitle
    7. End Get
    8. Set(ByVal value As String)
    9. _ValTitle = value
    10. lblValueTitle.Text = value
    11. End Set
    12. End Property
    13. Public Property Val As String
    14. Get
    15. Return _Val
    16. End Get
    17. Set(ByVal value As String)
    18. _Val = value
    19. tbValue.Text = value
    20. End Set
    21. End Property
    22. End Class


    Bei List(of ucValue), woher weiß ich, wo er welche platziert? Oder muss ich dann .Position einstellen?
    Soll ich dann einfach lstValue.Add und lstValue.Remove machen, wenn ich weiß, welche Anzahl ich brauche?

    sonne75 schrieb:

    Meinst du so?
    So:

    VB.NET-Quellcode

    1. Public Class ucValue
    2. Public Property ValTitle() As String
    3. Get
    4. Return lblValueTitle.Text
    5. End Get
    6. Set(ByVal value As String)
    7. lblValueTitle.Text = value
    8. End Set
    9. End Property
    10. Public Property Val As String
    11. Get
    12. Return tbValue.Text
    13. End Get
    14. Set(ByVal value As String)
    15. tbValue.Text = value
    16. End Set
    17. End Property
    18. End Class

    sonne75 schrieb:

    woher weiß ich
    Da musst Du weitere Properties implementieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    sonne75 schrieb:

    Wie teile ich ihm mit,
    Das UserControl als Basisklasse hat dies:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst dir auch mal den DataRepeater angucken - das ist son bischen ein Generator für UserControls - kann man so auffassen.
    Und ist auch databindeable.
    Allerdings musst du ihm eine BindingSource geben, die einen Filter entsprechend gesetzt hat, dass sie nur die gewünschten Datensätze anzeigt oder ein DataView, oder ein Linq2Dataset-Dataview oder sowas.
    @RodFromGermany
    Stimmt, Location statt Position. Aber wozu brauche ich eine extra Property, wenn ich es über ucValue(0).Location regeln kann?

    Soll ich dann einfach lstValue.Add und lstValue.Remove machen, wenn ich weiß, welche Anzahl ich brauche?

    Ist es besser sie immer neu zu erstellen oder eine feste Anzahl schon vorher erstellen und jeweils zu verstecken?


    @ErfinderDesRades
    Ich suche mal gleich danach. Ich hätte ja alle gewünschte Datensätze über .GetValueRows() drin, reicht das nicht?
    EDIT: ich sehe keinen Unterschied zu normalen Controls, die an die DataTable gebunden sind. Ich habe nicht gefunden, wie man damit mehrere Datensätze gleichzeitig (untereinander) NICHT im DGV-Stil anzeigen kann, immer nur einen Datensatz auf einmal...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sonne75“ ()

    sonne75 schrieb:

    Aber wozu brauche ich eine extra Property
    zu schnell in die Antwort geschrieben. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades
    Aber wo kann ich dann bestimmen, welche angezeigt werden? Zur Zeit wird bei dir wohl alles angezeigt und nur das aktuelle Element markiert.
    Wie kann ich "ValueBindingsSource" filtern, dass nur die ValueRows von .GetValueRows() angezeigt werden?
    Wow, kann ich nur sagen. 8o :thumbup:
    Das Ding macht alles automatisch!!

    Nur mit der Bindingssource musste ich tricksen. Wenn man direkt in den DataRepeater zieht, erstellt er keine untergeordnete Bindingsource von der Tabelle (wie bei Parent-Child-View), sondern eine direkte. Dann habe ich erst ein Wert von der untergeordneten Tabelle einfach auf die Form gezogen, die richtige Bindingsource wurde erstellt. Dann Control gelöscht und in den DataRepeater gezogen, so konnte es dann der richtigen Bindingsouce zugeordnet werden.