Mehrere Controls in einer Liste führen und verwenden

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Mehrere Controls in einer Liste führen und verwenden

    Hi,

    ich möchte 20 ComboBox(en) mit einer Liste befüllen.
    Dazu habe ich diese alle mit
    Dim Controlliste() as ComboBox = {ComboBox1, Combobox2, usw.}
    aufgeführt.
    Wenn ich aber nun in ComboBox(0) der Liste nun was Hinzufügen möchte, bekomme ich nur ein Error:
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Das ist mein momentaner Code:

    VB.NET-Quellcode

    1. Public Class Main
    2. Dim NameList As New List(Of String)
    3. Dim Controlliste() As ComboBox = {ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6, ComboBox7, ComboBox8, ComboBox9, ComboBox10, ComboBox11, ComboBox12, ComboBox13, ComboBox14, ComboBox15, ComboBox16, ComboBox17, ComboBox18, ComboBox19, ComboBox20}
    4. Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Debug.Print(Controlliste.Length.ToString)
    6. Controlliste(0).Items.Add("Test")
    7. Using r As IO.StreamReader = New IO.StreamReader(Environment.CurrentDirectory & IO.Path.DirectorySeparatorChar & "Namensliste.txt")
    8. Do While r.Peek() >= 0
    9. Dim i As Integer = 0
    10. Do While Not i = Controlliste.Length
    11. Controlliste(i).Items.Add(r.ReadLine())
    12. i += 1
    13. Loop
    14. NameList.Add(r.ReadLine())
    15. Loop
    16. End Using
    17. End Sub
    18. End Class


    Ich verstehe nicht, wieso das nicht geht oder kann man Controls einfach nicht in einer Liste zusammenführen?

    mfg

    gfc
    Wenn dann musst du schon instanzieren. Aber wieso sollte man das wollen? DataBinding wäre da deutlich besser, was auch immer du vor hast.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    ^^ VS2012 Schlägt vor, das "New" zu streichen, bekomme nähmlich den Fehler: "Arrays können nicht mit "New" deklariert werden."
    Die "Comboboxen" exestieren schon auf der MainFrm und wollte diese mit der Liste kompakt halten.
    @Trade
    Ich möchte Div. Namen auf Comboboxen verteilen. Darauf kann man dann bestimmen, mit wem man am liebsten in der Gruppe wäre, mit wem weniger.
    Bilder
    • Unbenannt.PNG

      10,76 kB, 447×260, 215 mal angesehen
    Stimmt, jedoch warum ein 'ComboBox-Array'? Neben dem DataBinding etc. der Vorschlag: Geh halt alle Chechboxen auf der Form mit For Each durch und füge sie dann zur Liste hinzu.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hi
    die Controls müssen erst instanziert werden, bevor du sie in ein Array packst.

    Die Vorgehensweise ist übrigens nicht sauber:
    1. Liste verwenden, an die gebunden wird (ComboBox.DataSource verwenden und dort keine Strings reinklatschen, sondern eine Klasse, die der Verwendung entspricht und einen anzuzeigenden Text über DisplayMember bereitstellen, das ist der Name der Property)
    2. Dim wird ausschließlich in Methodenkörpern verwendet, niemals auf Klassenebene, dort gibt es Public, Private, Protected, Protected Friend und Friend.
    3. IO.Path.Combine statt der Methode mit dem IO.Path.DirectorySeparatorChar
    4. Ggf. überlegen, ob es nicht ein Format gibt, das erzwingt dass die Daten in die jeweiligen Comboboxen geworfen wird (oder ggf. auch ein DataSet?)
    Ich persönlich bin ja kein wirklicher Fan von solchen Control-Arrays, es erscheint mir unsauber, sie als Daten in ein Array zu klatschen. Wenn du Punkt 1 ausbesserst, hast du eher eine System.ComponentModel.BindingList(Of T) in einem Array mit Elementtyp System.Collections.Generic.IList(Of T), daher wären das explizit Daten. Es wäre eben auch schön, da eine Klasse hineinzuschmeißen, deren Inhalt durch den String in der Datei beschrieben wird und die du eben dann, quasi, parst.

    Kann dein Code eigentlich überhaupt gutgehen? ReadLine liest immer die nächste Zeile ein, somit enthalten die ComboBoxen nicht die gleichen Einträge. Wenn das ungewünscht ist, schmeiß' einfach alle in eine gemeinsame Liste (als Klasse :P) und binde alle ComboBoxen an diese Liste.

    Gruß
    ~blaze~
    In dem Moment, wo Du das Array erzeugst, sind die ComboBoxen noch Nothing, da sie noch gar nicht erstellt wurden. Sollte eigentlich jedem klar sein. Du darfst sie erst nach der InitialzieComponents()-Funktion der Auflistung hinzufügen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Nur so ein Gedanke: könnt's in etwa so auch funktionieren?

    VB.NET-Quellcode

    1. Dim LCbb = Me.Controls.Where(Function(Value As Control) Value Is ComboBox)

    (ungetestet)

    gfcwfzkm schrieb:

    VB.NET-Quellcode

    1. Dim Controlliste() As ComboBox = {ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6, ComboBox7, ComboBox8, ComboBox9, ComboBox10, ComboBox11, ComboBox12, ComboBox13, ComboBox14, ComboBox15, ComboBox16, ComboBox17, ComboBox18, ComboBox19, ComboBox20}
    Diese Programmzeile wird aufgerufen, bevor mit New die Boxen instanziiert wurden.
    Erstell die Liste in der Form_Load.

    VB.NET-Quellcode

    1. Dim NameList As New List(Of String)
    2. Dim Controlliste As New List(Of ComboBox)
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. Me.Controlliste.AddRange({ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6, ComboBox7, ComboBox8, ComboBox9, ComboBox10, ComboBox11, ComboBox12, ComboBox13, ComboBox14, ComboBox15, ComboBox16, ComboBox17, ComboBox18, ComboBox19, ComboBox20})
    5. Debug.Print(Controlliste.Count.ToString)
    6. Controlliste(0).Items.Add("Test")
    7. Using r As IO.StreamReader = New IO.StreamReader("c:\Temp\Namensliste.txt")
    8. Do
    9. Dim i As Integer = 0
    10. Do While i < Controlliste.Count
    11. If r.Peek() < 0 Then
    12. Exit Sub
    13. End If
    14. Controlliste(i).Items.Add(r.ReadLine())
    15. i += 1
    16. Loop
    17. If r.Peek() < 0 Then
    18. Exit Sub
    19. End If
    20. NameList.Add(r.ReadLine())
    21. Loop
    22. End Using
    23. End Sub
    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!
    Vielen Dank RodFromGermany, nun funktioniert es.
    Gut zu wissen das wenigstens mein Grundgedanke nicht falsch war (aber die Umsetztung, aber das wird schon ;) ) =)

    Damit wäre mein Problem gelöst.

    Danke auch an die anderen :)

    MfG

    gfc