[C#] Treeview aus DB füllen

Hallo zusammen, ich habe aktuell das Problem, dass ich beim Füllen einer Treeview immer wieder die Fehlermeldung bekomme:

Code:
Die Auflistung wurde geändert; möglicherweise wurde die Enumeration nicht ausgeführt.

Jedoch kann ich mir nicht erklären, dass ich die Auflistung irgendwie, oder in irgendeiner Form ändere.

Meine Treeview bereite ich wie folgt auf:

Code:
private void FillTreeView()
        {
            TreeNode root = (treeView1.Nodes[0].Name == "Bibliothek" ? treeView1.Nodes[0] : treeView1.Nodes.Add("Bibliothek"));
            
            root.EnsureVisible();
            root.TreeView.Focus();
            root.TreeView.Select();

            DataSet dsCDs = LoadData("SELECT DISTINCT ID, Name FROM CDs ORDER BY Name");
            try
            {
                foreach (DataRow rowCD in dsCDs.Tables[0].Rows)
                {
                    int cdID = Convert.ToInt32(rowCD["ID"]);
                    TreeNode childRoot = new TreeNode(rowCD["Name"].ToString());
                    root.Nodes.Add(childRoot);
                    childRoot.ImageIndex = 1;
                    childRoot.SelectedImageIndex = 1;
                    childRoot.Parent.Expand();

                    DataSet dsTracks = LoadData("SELECT Title, Artist, Nr FROM Tracks WHERE FK_CDs_ID = " + cdID + " ORDER BY Nr");
                    foreach (DataRow rowTrack in dsTracks.Tables[0].Rows)
                    {
                        TreeNode childCD = new TreeNode("#" + rowTrack["Nr"].ToString() + " " + rowTrack["Artist"].ToString() + " - " + rowTrack["Title"].ToString());
                        childRoot.Nodes.Add(childCD);
                        childCD.ImageIndex = 2;
                        childCD.SelectedImageIndex = 2;
                    }
                    dsTracks.Dispose();
                }
                dsCDs.Dispose();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

Hat jemand von Euch eine Idee?
Ein Node mit x Children wird gesetzt, beim zweiten Node + Children steigt er aus.
 
Zuletzt bearbeitet:
bitte mal die ganze exception mit stacktrace


abgesehen davon sei dir die statische funktion Format() aus der String klasse ans herz gelegt ...

zudem ist der UI thread nicht dafür da datenmengen aus einer DB zu holen ... das führt zu hängenden anwendungen ... dinge die zeitaufwendig sein können kann man relativ einfach mit der ThreadPool klasse vom UI thread trennen, ohne all zu viel aufwand damit zu haben ... du musst lediglich auf eine sache achten: wenn die daten abgeholt und aufbereitet sind, und du sie auf die UI ausgeben willst, darf nur der UI thread mit den controls hantieren, und auch nur der UI thread sollte neue controls erzeugen... um dies zu gewährleisten gibts die schnitstelle ISynchronizedInvoke ... die stellt eine property namens "InvokeRequired" zur verfügung, mit der du prüfen kannst ob der aktuelle thread auf das control zugreifen darf, oder ob er einen invoke-call braucht ... praktischer weise bietet die schnittstelle auch gleich die Invoke-Funktion an ... die führt einen threadübergreifenden call synchron aus, und blockiert den aufrufenden thread solange bis der gerufene thread mit der ausführung fertig ist... alternativ gibts BeginInvoke() und EndInvoke() für die asynchrone ausführung ... die Klasse Control implementiert ISynchronizedInvoke und vererbt diese funktionalität freundlicherweise
 
Zurück
Oben