Γεια χαρα! Ειμαι νεος στο φορουμ.
M@jestic Το προβλημα με το array out of... ειναι στο
treeView1.Nodes[0].Nodes.Add(newNode);
(Γνομη μου, δεν ειναι c++ αρα καλυτερα να αποφευγεις τα [])
Το treeview δεν εχει κανενα node απο μονο του, αμα εχεις καποιο(α) standar root μπορεις να τα βαλεις στο iniz του προγραμματος πχ
treeView1.Nodes.Add(new TreeNode { Text = "Players", Name = "players_node" });
(συν ενα Name για ευκολη αναζητηση) Επειδη υπαρχει το LINQ στα array ειναι περιττο να χρησιμοποιεις for loops. Πχ αμα εχεις το παραπανω Node ("players_node") και θελεις να βαλεις (ή βγαλεις) καποιο Node μπορεις απαλα να καλεσεις τη Find()
treeView1.Nodes.Find("players_node", true).Single().Nodes.Add(new TreeNode { Text = "test"});
Και τελος, καπου ειδα οτι βαζεις nodes απο αλλο thread. Για αυτο πρεπει να κανεις invorke (αμα πατησεις πανω στο exception θα σου βγαλει ενα sample για cross-thread), εγω οταν εχω να κανω με cross-thread φτιαχνω μια method του τυπου async_name και ειναι καπος ετσι
void AsyncAddSomething(object obj)
{
Action<object> func = new Action<object>(AsyncAddSomething);
if (winform_Control.InvokeRequired)
this.Invoke(func, new object[] { obj });// this form
else
winform_Control.AddData(obj);
}
Μπορεις να κανεις και ενα extension αν εχεις αρκετες φορμες πχ
public static class Ex
{
public static void AsyncAdd(this TreeNodeCollection coll, Control parentOf,TreeNode obj)
{
if (parentOf.InvokeRequired)
parentOf.Invoke(new Action<TreeNodeCollection, Control, TreeNode>(AsyncAdd), new object[] { coll, parentOf, obj });
else
coll.Add(obj);
}
}
Δες μια πρωχιρη δουλεια (ενα χ thread βαζει nodes στο "κυριο" προγραμμα)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace treeview
{
public partial class Form1 : Form
{
Thread thread;
public Form1()
{
InitializeComponent();
thread = new Thread(worker);
this.Load += delegate { thread.Start(); };
treeView1.Nodes.Add(new TreeNode { Text = "Players", Name = "players_node" });
}
void worker()
{
for (int i = 1; i < 11; i++)
{
AsyncAdd(string.Format("Node:{0}", i));
Thread.Sleep(500);
}
}
void AsyncAdd(string obj)
{
Action<string> func = new Action<string>(AsyncAdd);
if (treeView1.InvokeRequired)
this.Invoke(func, new object[] { obj });
else
treeView1.Nodes.Find("players_node", true).Single().Nodes.Add(new TreeNode { Text = obj });
}
}
}
υγ: Πως βαζω code tag?