Inhalt von ListView (Steuerelement) ByRef in Klasse füllen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Inhalt von ListView (Steuerelement) ByRef in Klasse füllen

    Guten morgen
    Eine Grundsatzfrage . . .

    - VisualStudio 2017
    - SQL-Server Express
    - Verschiedene Formulare

    Als Auswahlfelder möchte ich unter anderem eine CheckedListBox einsetzen, um mehrere Begriffe für eine Datenabfrage auswählen zu können.
    Befüllen möchte ich diese Controls mit einer eigenen Klasse (nennen wir sie SQLGetData), welche für mich den Verbindungsaufbau zur Datenbank und die Abfrage der Daten ausführt. Die per SQL-String abgefragten Daten speichere ich in einer DataTable in der Klasse SQLGetData.

    Aufruf der Klasse SqlGetData
    SqlGetData.Fill( ByRef MyCLB as CheckedListBox, ByVal SQLAbfrageString as String, ByVal DBConnectionString as String)

    Die Daten werden abgefragt und in die DataTable geschrieben.
    Die Listbox übergebe ich als Referenz und befülle die Rows per .item.add.

    ... Aber im Formular wird die Listbox leer angezeigt.
    Müsste mit der Übergabe ByRef MyCLB das Controll nicht gefüllt werden?
    Was verstehe ich falsch?

    Als Ausweg fülle ich die Listbox im aufrufenden Formular. Aber das ist nicht die Lösung.

    Grüsse aus CH
    Roland
    ByRef brauchst Du nicht, wird automatisch so übergeben, da die CLB eine Klasse ist. Zeig mal bitte den passenden Code, denn folgendes läuft:

    VB.NET-Quellcode

    1. 'als Teil des Forms
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim TC As New TestClass
    4. TC.AddItemToCLB(CheckedListBox1)
    5. End Sub
    6. Public Class TestClass
    7. Public Sub AddItemToCLB(clb As CheckedListBox)
    8. clb.Items.Add("Test")
    9. End Sub
    10. End Class


    Allerdings sollte so eine externe Funktion keine Form-CEs manipulieren. Das Form sollte sich immer selber darum kümmern (können) =>

    lollipop schrieb:

    Als Ausweg fülle ich die Listbox im aufrufenden Formular. Aber das ist nicht die Lösung.
    Dein Ausweg wäre zwar die richtige Gangart, aber warum ist das für Dich keine Lösung?

    btw: Im Titel schreibst Du ListView, obwohl es um ne CLB geht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @lollipop Nicht ByRef befüllen, sondern das dem .NET immanente DataBinding verwenden, da ist alles erledigt.
    Und
    Ich empfehle Dir dringend, das ListView gegen ein DataGridView auszutauschen, da geht das alles smooth.
    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!
    Danke für die Anregungen.

    ​@VaporiZed:
    ​ListView oder CheckedListBox... es ging mir ums Prinizip, warum es nicht funktioniert.
    ​Und wirlich, ohne Angabe von ByRef oder ByVal funktioniert es.
    ​Nun noch die Frage, ob das Klug ist. Eigentlich müsste ich da gleich ein eigenes Steuerelement daraus machen. Dann wäre alles in einer Klasse.

    ​Es war für mich nur beschränkt eine Lösung, weil ich im Form möglichst wenig Code möchte und diese Kombination in verschiedenen Formularen zum Tragen kommen soll.

    ​@'RodFromGermany'
    ​Es war mich nicht bewusst, dass ich das DataGridView gleich einfach auf möglichst wenig Platz formatieren kann. Nun habe ich es ausprobiert und es wäre sicher auch eine Lösung.

    Danke für die Hilfe.

    lollipop schrieb:

    es wäre sicher auch eine Lösung
    Es ist die Lösung.
    Das ListView ist ein Dinosaurier unter den Controls, sozusagen dumm geboren und nix dazugelernt. ;)
    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!

    lollipop schrieb:

    Eigentlich müsste ich da gleich ein eigenes Steuerelement daraus machen.
    Das »müsste« kann ich zwar nicht ganz nachvollziehen, aber wenn es für Dein Projekt Sinn ergibt, das alles in ein User-CE auszulagern, ggf. auch um es anderweitig wiederzuverwenden, sehe ich da kein Problem. Ist wohl Geschmackssache, wieviel man auslagern und zusammenfassen will. Ich z.B. habe bisher nicht sonderlich viele User-CEs in meiner Werkzeugkiste rumliegen; obwohl das nix heißen mag, schließlich habe ich auch keine 500 Projekte am laufen => as you wish.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.