ListBox Fehler

  • VB.NET

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

    ListBox Fehler

    Hab mal wieder ein kleines Problem :whistling:

    Ich rufe das hier auf, um bei einer anderen Form bei ListBox einen Eintrag hinzufügen. Komischerweise funktioniert er, wenn ich es das erste mal aufrufe, ab dem zweiten Mal dann nicht mehr :huh:

    VB.NET-Quellcode

    1. Private Sub add_info(ByVal txt_info As String)
    2. info_window.lbs_info.Items.Add(txt_info) ' Fehler
    3. End Sub


    Danke schon mal
    gibts ne fehlermeldung? zur mal nebenbei: diese art von programmierung ist relativ unsauber (merkt man ja jetzt bei dir)
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Wegen info_window? Wie könnte ich es sonst tun?


    Fehlermeldung:

    Quellcode

    1. Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lbs_info erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.


    Wie kann ichs den für mehrere Threads tun?

    VB.NET-Quellcode

    1. Private Sub add_info(ByVal txt_info As String)
    2. info_window.lbs_info.Items.Add(txt_info) ' Fehler
    3. End Sub
    Ist info_window der Name einer Klasse oder eine Variable, die eine Instanz dieser Klasse hält?
    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!
    Versuch es mal so:

    VB.NET-Quellcode

    1. Private Delegate Sub Additem(ByVal Value As String)
    2. Sub AddItem2LB(Byval Value As String)
    3. info_window.lbs_info.Items.Add(Value)
    4. End Sub

    Und dann rufst du es etwa so auf:

    VB.NET-Quellcode

    1. Me.Invoke(New Additem(Address Of AddItem2LB), txt_info)
    --- Zurzeit inaktiv ---
    info_window ist eine Variable die eine Instanz dieser Klasse enthält

    Und so leicht ist das Delegate leider nicht einzubauen... werde es aber zuerst nochmals versuchen. Das komische ist ja eigentlich, dass ich nur einen Thread gestartet habe

    TTopsecret schrieb:

    info_window ist eine Variable die eine Instanz dieser Klasse enthält

    Oh, ich dachte das ist direkt die Klasse des Fensters.
    --- Zurzeit inaktiv ---
    nur mal so zu deinem programmierstil da den recht viele angesprochen haben(hab jetzt aber nich alle beiträge gelesen) kann ich dir nen kleinen tipp geben. In deinem Code erkennt niemand auch nur annähernd was, was ist. Deshalb wenn es ne Form ist mach doch einfach nen frmMeinFormName
    oder von mir aus nen frm_MeinFormName und wenns nen String ist nen str davor usw. Dadurch erkennt man immer gleich um was es geht. Sonst muss man immer räzeln was es ist. Außerdem fällts dir auch später wesentlich leicher damit umzugehen


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    hmm, grad seine Benamung ist doch eindeutig besser als das berühmte Form1, mit Listbox1 darauf. Sicher sind Namen mit Unterstrich schlechter lesbar, als Namen, bei denen Worte durch GroßkleinSchreibung segmentiert sind.
    Und man könnte noch eine Namenskonvention machen, wo durch Unterstrich angedeutet ist, dasses sich um Klassenvariablen handelt.

    _InfoForm

    Aber da findet sich hier suboptimaleres im Forum

    Memo schrieb:

    @milaim: Warum sollte es unsauber sein?

    Weil das nichts mit OOP zu tun hat.
    Controls auf anderen Formularen NIE direkt ansprechen. Hier musst du wissen, ob ein Fenster überhaupt im Speicher existiert (und sein Objekt). Wenn du das über eine Klasse und Events löst, muss die Klasse nichts von der Form wissen! Es feuert einfach ein Event ab. Wird dieses Event verwendet bzw. abgefangen, bekommst du ne message (in dem fall diese Information, die zur Listbox hinzugefügt werden soll). Am sonsten passiert einfach - nichts. Ist eben die Trennung von Oberfläche und Code, was hier auch schon erwähnt wurde.
    "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
    Danke für die aufschlussreiche Diskussion :thumbup: Ich freu mich immer, wenn Jemand noch weitere Verbesserungsvorschläge entgegenbringt

    Aber ich selber finde Underline viel Übersichtlicher, auch wenn es nicht der allgemeiner Art entspricht. Kürzel erstelle ich meistens nur für controls(z.B. "lbs_")
    Bisher ist das ganze Projekt noch nicht besonders OOP-mässig aufgebaut, werde ich wohl noch stark verbessern müssen

    Ihr könnt natürlich noch gerne weiterfahren
    Laß dich nicht verrückt machen (außer von mir ;) ). NamensKonventionen sind halt Konventionen, also Übereinkünfte. Und wenn du ein Ein-Mann-Team bist, mußt du dich nur mit dir selbst einigen.
    Microsoft hat sogar selbst Richtlinien für Benamung rausgegeben. Denen ich zB aber bewußt nicht folge, denn da kommen zT. irrsinnig lange VariablenNamen bei raus - sowas macht Code auch unleserlich.
    Hauptsache, du hast überhaupt ein Feeling für die Wichtigkeit sprechender Benamung.

    Milaim stimme ich so lala zu. Du hast scheinbar info_Form oder wie das hieß, im MainForm instanziert. Dann brauchst du kein Event, um in die Listbox zu grabschen, sondern info_Form sollte eine Public Methode anbieten, mit der es dann selbst in seine Listbox grabscht - damit müsste OOP nach Milaim zufriedengestellt sein.
    Gugge auch VeryBasics - Abschnitt "Prinzipieller Aufbau eines Programms / Kommunikation der Objekte".

    Ich bin nichtmal damit richtig zufrieden, weil ich überhaupt nicht in die Listbox grabschen würde, sondern wie gesagt, die Listbox an eine geeignete DatenAuflistung binden täte.