Listbox mit Daten aus Array oder List of füllen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Top44.

    Listbox mit Daten aus Array oder List of füllen

    Hi,

    stehe mal wieder auf dem Schlauch ... Eventuell könnt ihr helfen:

    Übergebe einer Sub einen String aus einer Klasse.
    In der Empfänger Sub kommt auch alles soweit an ... hätte das aber gerne in einem Array() oder einer List of(T )

    Jetzt will ich es an ein Listbox Binden:

    Quellcode

    1. ​ Public Sub addListBox2(ByVal user As String)
    2. MessageBox.Show(user)
    3. newList.Add(user)
    4. arrlist = newList.ToArray
    5. ListBox1.BeginUpdate()
    6. ListBox1.Items.AddRange(arrlist)
    7. Me.ListBox1.DataSource = arrlist
    8. ListBox1.EndUpdate()
    9. ListBox1.Update()
    10. ListBox1.Refresh()
    11. End Sub


    Ich bekomme es ums verrecken nicht hin dort etwas rein zubekommen ....
    Habe auch schon Probiert das Array über eine schleife zu füllen ...

    Mir ist ein List of(T ) lieber das ich an die Listbox binden kann ... Bekomme aber auch hier nichts.

    Grüße
    Wenn du arrList als BindingList(Of String) deklarierst, dann brauchst du nur im Form_Load die Listbox ein einziges Mal dran zu binden.
    Im weiteren die Listbox ganz in Ruhe lassen - nicht mehr anfassen!!

    dein AddListbox würde sich dergestallt reduzieren:

    VB.NET-Quellcode

    1. private arrList as New BindingList(Of String)
    2. Sub Form_Load(sender as Object, e as Eventargs)
    3. Listbox1.DataSource=arrList ' das ist alles - mehr **nicht**!!
    4. End sug
    5. Public Sub addListBox2(ByVal user As String)
    6. arrList.Add(user)
    7. End Sub
    Wirklich -das ist alles, weiteres ist nur schädlich.
    Danke! Bäume und Wald und so ...

    Jedoch klappt auch das nicht. Sollte ich vielleicht erwähnen, dass die Listbox innerhalb eines Tabcontrols liegt... ?
    Eher unwahrscheinlich das es daran liegt.

    Genauso umgesetzt wie du vorgeschlagen hast, auch mit:

    Quellcode

    1. ​ arrList.Add(user)
    2. ListBox1.Refresh()
    3. ListBox1.Update()

    versucht.

    Grüße und Danke!

    Quellcode

    1. Public Class Form1
    2. Dim server As New cls_server
    3. Dim pdata As New cls_programdata
    4. Private arrList As New BindingList(Of String)
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. ListBox1.DataSource = arrList
    7. server.SStart() 'Starte TCP-Server
    8. End Sub
    9. 'Dim newList As List(Of String) = New List(Of String)
    10. Public Sub addListBox2(ByVal user As String)
    11. arrList.Add(user)
    12. End Sub
    13. Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
    14. 'Me.Show()
    15. ShowInTaskbar = True
    16. Me.WindowState = FormWindowState.Normal
    17. NotifyIcon1.Visible = False
    18. End Sub
    19. End Class


    Klasse wo der String herkommt:

    Quellcode

    1. Sub Server_Start()
    2. Form1.addListBox2(c.nick)
    3. End Sub


    Grüße
    oh - was ich vorschlug, hast du doch richtig umgesetzt :thumbsup: , also sorry :saint:

    Dein Problem liegt ganz woanders, nämlich beim Threading, und dass du aus einem Modul oder sonstwoher (wo der String herkommt) versuchst, in ein Form zu grabschen.

    3 Dinge sind zu tun:
    1. Die Klasse, wo der String herkommt, darf nicht (kann sie ja eh nicht, wie du siehst), ins Form reingrabschen.
      Sondern sie muss ein Event senden.
    2. Das Form muss dieses Event empfangen
    3. Die Klasse läuft ausserdem sie in einem NebenThread, das ist bei Tcp-Empfangereien so. Daher muss das Form die Aktion, nämlich das adden des user-Nicks, in den MainThread verlegen, mittels Me.BeginInvoke().
    Kannst du ein Event selbst definieren, und dann richtig empfangen? sonst gugge Alles über Events

    Top44 schrieb:

    Was mich dennoch wundert, ..., wieso wird der String übertragen?
    Ein Thread arbeitet in einem ziemlich großen eigenen Speicherbereich. Wie du da das Form ansprichst, dabei erstellt vb.net flugs ein neues, denn das Form auf dem Bildschirm ist nicht zugänglich, da im MainThread.
    Gut, da wird der String ins flugs erstellte neue Form übertragen - hat einen Haken:

    Das neue Form ist überhaupt nicht sichtbar :P - hat ja niemand Form.Show aufgerufen (in dem Thread, für das Form).
    Hi, ich nochmal ...

    3 Dinge sind zu tun:Die Klasse, wo der String herkommt, darf nicht (kann sie ja eh nicht, wie du siehst), ins Form reingrabschen.
    Sondern sie muss ein Event senden.

    Das Form muss dieses Event empfangen

    Die Klasse läuft ausserdem sie in einem NebenThread, das ist bei Tcp-Empfangereien so. Daher muss das Form die Aktion, nämlich das adden des user-Nicks, in den MainThread verlegen, mittels Me.BeginInvoke().


    Irgendwie kann ich das nicht begreifen ... Der Link macht mich auch nicht schlauer ..

    Ich habs mir jetzt so gedacht:

    1) Schreibe in die arrList (BindingList)
    2) Sende Event das sich die Binding List erweitert hat ...
    3) Invoke für das Updaten?

    Bin ich da auf dem richtigen Pfad?

    Danke und Grüße
    du weichst von der von mir vorgeschlagenen Reihenfolge ab:
    1. Die Klasse soll das Event senden. Sie soll nichts der arrList zufügen, denn arrList ist ja ein Member des Forms, in das die Klasse ja nicht reingrabschen soll (und kann).
    2. Das Form soll das Event empfangen - du hast gesagt, das kriegest du hin.
    3. Ausserdem muss das Form mit Me.BeginInvoke das hinzufügen des neuen nicks in den MainThread transferieren.
    Ich schlage vor, du machst alles soweit fertig, und das einfügen des BeginInvokes kann ich dir dranbasteln. Mach eins nach dem anderen, und in dieser Reihenfolge.
    Danke nochmals.

    Ich komme von der Vorgehensweise bzw. der Umsetzung nicht zu einem vernünftigem Ergebnis.
    Alles was ich bisher gelesen habe bringt mich leider nicht weiter.


    cls_server.vb
    -> Withevents MyForm As form1

    Form1.vb
    -> Addhandler + Me.Invoke

    Checke es einfach nicht. Danke dir trotzdem!

    Grüße

    [EDIT]
    Hab´s nun erledigt ... Hatte nen völlig falschen Ansatz im Kopf :)

    Falls es jemand braucht:

    Quellcode

    1. Dim licenselist As New BindingList(Of String)
    2. Dim loglist As New BindingList(Of String)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim sdata As New cls_server(Me)
    5. lb_licenses.DataSource = licenselist
    6. lb_log.DataSource = loglist
    7. End Sub


    In die Class:

    Quellcode

    1. Dim updateControl As New updateControlHandler(AddressOf frm.Additem_license)
    2. Dim logControl As New logControlHandler(AddressOf frm.Additem_log)


    sowie:

    Quellcode

    1. Dim frm As Form1 = Me.sender 'MainForm form = (MainForm)sender;
    2. Dim updateControl As New updateControlHandler(AddressOf frm.Additem_license)
    3. Dim logControl As New logControlHandler(AddressOf frm.Additem_log)
    4. Dim param(0) As Object
    5. param(0) = c.nick
    6. frm.Invoke(updateControl, param)


    Danke nochmals!

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