ListBox in Userform aus anderem Modul befüllen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von E-Ros89.

    ListBox in Userform aus anderem Modul befüllen

    Hallo Freunde des Programmierens :),

    Ich bin von VBA auf VB.Net umgestiegen und habe jetzt ein Problem bei der Argumentübermittlung beim Aufruf einer Sub, die in einem andern Modul steht und die eine ListBox in einer Form befüllen soll.
    Im Detail: ich habe in meiner frm_Main mehrere Listboxen, die alle nach dem gleichen Schema, jedoch mit unterschiedlichen Werten mittels DB-Abfrage, befüllt werden sollen. Dazu rufe ich eine Sub "QueryToMultiColumnList", die im Modul "DatabaseToForm" steht, auf und übergebe an diese die Argumente um welche DB-Abfrage es sich handelt(als String), um welche ListBox es sich handelt(Name der ListBox) und optional das Jahr(als String).

    Der funktionierende Aufruf in VBA sieht beispielsweise so bei mir aus: DatabaseToForm.QueryToMultiColumnList "SucheVerfahrenEinesJahres", frm_main.verfahrenListe, zweiStellenJahr
    Oder anderes Beispiel: DatabaseToForm.QueryToMultiColumnList "SucheAbgabenEinesJahres", frm_main.verfahrenListe, zweiStellenJahr
    Die aufgerufene Sub sieht in VBA so aus: Sub QueryToMultiColumnList(ByVal QueryName As String, ByRef MultiColumnList As MSForms.Control, Optional ByVal Parameter As String)

    Wie gesagt: es funktioniert alles einwandfrei. Die Strings steuern die jeweilige DB-Abfrage und das Abfrageergebnis wird fehlerfrei in die einzelnen ListBoxen geschrieben.

    Nun habe ich versucht das in VB.Net nachzubilden.
    Dort sieht der Aufruf der Sub aus der frm_Main so aus:

    VB.NET-Quellcode

    1. DatabaseToForm.QueryToMultiColumnList("SucheVerfahrenEinesJahres", me.verfahrenListe, zweiStellenJahr)

    Die aufgerufene Sub im Modul DatabaseToForm sieht so aus:

    VB.NET-Quellcode

    1. Sub QueryToMultiColumnList(ByVal QueryName As String, ByRef MultiColumnList As ListBox, Optional ByVal Parameter As String = "Default")


    So weit, so gut. Auf den ersten Blick funktioniert auch alles und Visual Studio 2019 wirf keinen Fehler. Beim Debuggen(Einzelschritt) fällt jedoch auf, das der Pointer auf die Listbox nicht funktioniert und deswegen die Listbox nicht befüllt wird. Die Datenbankabfrage funktioniert und bringt ein Ergebnis, welches ich mittels Do While-Schleife und MultiColumnList.Items.Add(recSet.Item(0)) in die ListBox bringen wollte.

    Weiß von euch jemand, warum der Pointer auf die ListBox nicht funktoniert?

    VG :)
    Willkommen im Forum. :thumbup:

    E-Ros89 schrieb:

    VB.NET-Quellcode

    1. Sub QueryToMultiColumnList(ByVal QueryName As String, ByRef MultiColumnList As ListBox, Optional ByVal Parameter As String = "Default")
    Übergib mal die ListBox nicht ByRef, sondern ByVal:

    VB.NET-Quellcode

    1. Sub QueryToMultiColumnList(ByVal QueryName As String, ByVal MultiColumnList As ListBox, Optional ByVal Parameter As String = "Default")
    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!
    Willkommen im Forum.

    Ob ByRef oder ByVal ist hier wurscht. Zumindest, wenn ich teste, ob im Modul die Items manipuliert werden können, klappt das mit beidem.

    E-Ros89 schrieb:

    das der Pointer auf die Listbox nicht funktioniert
    Was soll das genau heißen? Wie äußert sich das?
    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.
    Mit ByRef könnte New ListBox() zuurückgegeben werden, das ist gewiss nicht gewollt.
    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!
    Den einzigen Codehinweis haben wir hier:

    E-Ros89 schrieb:

    Do While-Schleife und MultiColumnList.Items.Add(recSet.Item(0))
    Du hast recht, wenn im Modul irgendein Mumpitz passiert, der hier noch nicht zu sehen ist, könnte das von Dir erwähnte durchaus dabei sein.
    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.
    Danke für eure Antworten. :thumbup:

    Das Problem hat sich quasi von alleine geklärt. Die Übergabe funktionierte seit Anfang an. Die Kontrolle des Übergabewert bei der Einzelschritt-Debuggung ergab immer "Null", sodass ich glaubte, es würde wirklich nichts übergeben werden, auch kein Systemwert o.ä.. Aber es wird ein Wert übergeben, welcher nur nicht angezeigt werden kann ?(

    Jetzt noch eine andere Frage zum Thema ListBox:
    Kennt von euch jemand einen Trick, wie die ListBox in VB.Net genauso reagiert, wie in VBA? Also das die Anzahl der Spalten angegeben werden kann, das egal welchen Spalte angeklickt wird die ganze Zeile markiert wird und das man Werte aus/in die ListBox mittels Angabe von x,y aus-/einlesen kann(List-Eigenschaft).
    Nun, wenn zu Frage 1 noch ein ? besteht, sollte dies auch noch geklärt werden. In die ListBox werden also Items hinzugefügt, die nicht anzeigbar sein? Was wird denn angezeigt? Gar nichts? LeerString? Der Datentypname?

    Zu Frage 2: Nein, das geht nicht. Dafür ist die VB.NET-ListBox nicht gemacht. Für die Anzeige (und ggf. Bearbeitung) komplexer Datentypen (also mit mehreren Werten pro Eintrag) gibt es das DGV (DataGridView). Und nein, bevor Du das irgendwo aufschnappst oder jemand Dich davon überzeugen will: das ListView im DetailView ist dafür nicht gedacht! Auch wenn ganz viele Einsteiger davon Gebrauch machen (wollen).
    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.

    VaporiZed schrieb:

    Nun, wenn zu Frage 1 noch ein ? besteht, sollte dies auch noch geklärt werden. In die ListBox werden also Items hinzugefügt, die nicht anzeigbar sein? Was wird denn angezeigt? Gar nichts? LeerString? Der Datentypname?


    Nein es besteht keine Frage mehr. Ich bin dem Irrtum unterlaufen, das ich bei "ByRef MultiColumnList As ListBox" einen Systemwert oder einen String übernehme. Stattdessen war dort immer "Null" zu lesen.