Jag har problem med att ladda en treeView ifrån en databas. Jag har kommit en bit på vägen, men kan inte få in tätt child... hur ser tabellen ut? Helt underbart. Lägg till en imagelist till din form (eller var du nu har trädet). Tack, helt kanon. Nåt sånt här kanske: Helt kalas, tack. testa att sätta treeView1.Sorted=true; då skall den sortera noderna i bokstavsordning... iallafall enligt dokumentationen... (och när jag testade lite) Nu skäms jag.Om treeView och databas.
Min SQL:
<code>
SQLstring = "SELECT DISTINCT t_Län.Län, t_Kommun.Kommun FROM t_Län INNER JOIN t_Kommun ON t_Län.L_ID = t_Kommun.Län ORDER BY t_Län.Län, t_Kommun.Kommun";
</code>
Jag ville alltså ladda alla kommunerna först, och sedan i noderna resp kommun.
<code>
da = new OleDbDataAdapter(SQLstring,con);
ds = new DataSet("frånLänKommun");
con.Open();
da.Fill(ds,"frånLänKommun");
con.Close();
int rader = ds.Tables["frånLänKommun"].Rows.Count;
nr = new string[rader];
for(int a=0;a<rader;a++)
{
treeView1.Nodes.Add(ds.Tables["frånLänKommun"].Rows[a]["Län"].ToString());
//nr[a] = ds.Tables["frånKunder"].Rows[a]["Kundnr"].ToString();
}
}catch(Exception fel)
{
MessageBox.Show(fel.Message,"Här blev det fel",MessageBoxButtons.OK,MessageBoxIcon.Error);}
</code>
Men jag kommer alldeles fel.
Koden ser kanske lite mysko ut, jag har använt en del ifrån min övningsbok, men den täcker ju inte detta.
Hur bör jag göra?Sv: Om treeView och databas.
Jag måste väll ha en WHERE sats??
<code>
treeView1.Nodes.Clear();
string SQLstring ="SELECT Län FROM t_Län"; treeView1.Nodes.Clear();
string SQLstring ="SELECT Län FROM t_Län";
da = new OleDbDataAdapter(SQLstring, con);
ds = new DataSet("frånLän");
con.Close();
con.Open();
da.Fill(ds,"frånLän");
con.Close();
treeView1.ImageIndex=0;
int rader = ds.Tables["frånLän"].Rows.Count;
nr = new String[rader];
for(int a = 0;a < rader; a++)
{
TreeNode node = treeView1.Nodes.Add(ds.Tables["frånLän"].Rows[a]["Län"].ToString());
string SQL ="SELECT DISTINCT t_Län.Län, t_Kommun.Kommun FROM t_Län INNER JOIN t_Kommun ON t_Län.L_ID = t_Kommun.Län ORDER BY t_Län.Län, t_Kommun.Kommun";
da1 = new OleDbDataAdapter(SQL, con);
ds1 = new DataSet("frånLän_Kommun");
con.Close();
con.Open();
da1.Fill(ds1,"frånLän_Kommun");
con.Close();
int rad = ds1.Tables["frånLän_Kommun"].Rows.Count;
nr = new String[rad];
for(int b = 0;b < rad; b++)
{
node.Nodes.Add
(ds1.Tables["frånLän_Kommun"].Rows[b]["Kommun"].ToString());
}
}</code>
Hur får jag in childen?Sv: Om treeView och databas.
typ:
Län |Kommun
Skåne |Malmö
Skåne |Lund
Halland |Laholm
...
Jag vet inte om detta är det bästa sättet men det borde fungera iallafall:
<code>
Hashtable unika_lan=new Hashtable();
int lanSelected=1; //ikon indexet för län, när lännoden är öppen i imageliste
int lanVanlig=0; //ikon indexet för vanligt län
int kommunIkonIndex=2;
for(int a=0;a<rader;a++)
{
string lan=ds.Tables["frånLänKommun"].Rows[a]["Län"].ToString();
string kommun=ds.Tables["frånLänKommun"].Rows[a]["Kommun"].ToString();
if(unika_lan.ContainsKey(lan)) //om länet redan finns
{
ArrayList kommunlista=(ArrayList)unika_lan[lan];
kommunlista.Add(kommun); //lägg till kommunen till länet
unika_lan[lan]=kommunlista;
}
else //länet fanns inte. Skapa en kommunlista
{
ArrayList nykommunlista=new ArrayList();
nykommunlista.Add(kommun);
unika_lan[lan]=nykommunlista;
}
}
IDictionaryEnumerator idic=unika_lan.GetEnumerator();
while(idic.MoveNext()) //för alla län
{
string lan=(string)idic.Key;
TreeNode node=new TreeNode(lan); //skapa en län-trädnod
node.SelectedImageIndex=lanSelected;
node.ImageIndex=lanVanlig;
ArrayList kommuner=(ArrayList)idic.Value; //hämta kommunlistan
for(int i=0;i<kommuner.Count;i++) //för varje kommun
{
TreeNode kommun=new TreeNode((string)kommuner[i]); //skapa en nod
kommun.SelectedImageIndex=kommunIkonIndex;
kommun.ImageIndex=kommunIkonIndex;
node.Nodes.Add(kommun); //lägg till länets nod
}
treeView1.Nodes.Add(node);
}</code>
Ett alternativ hade oxå varit att på nåt sätt ställa frågor direkt mot datatablen så att du skulle kunna filtrera på län. Tror att man måste ha en dataview då men är osäker...
Databas grejer är inte riktigt mitt häradSv: Om treeView och databas.
Ett smolk i bägaren trots allt.
Jag ville ha olika iconer för län resp kommun, hittar inte var jag skall lägga dem för att det skall bli bra.
Tack för all din hjälp.Sv: Om treeView och databas.
Ändra treeviewns Imagelist till denna
sen kan du bara sätta node.SelectedImageIndex och ev node.ImageIndex till det indexet som du ikon har i imagelistan...
ändrar lite i koden ovan...Sv: Om treeView och databas.
Men hur kan jag kolla om det är child eller parent jag klicka på?
<code>
if(treeView1.SelectedNode=treeView1.Parent)
{
label1.Text=treeView1.SelectedNode.Text;
treeView1.SelectedImageIndex=2;
}
</code>
Fungerar ju inte(skratta inte).
Jag skulle behöva ha ut t ex
Kronoberg Växjö
Går det?Sv: Om treeView och databas.
<code>
TreeNode node=treeView1.SelectedNode;
string txt="";
if(node.Parent!=null) //det är en child (kommun)
{
txt=node.Parent.Text;
txt+=" " +node.Text
node.SelectedImageIndex=2;
}
else
{
txt=node.Text;
node.SelectedImageIndex=2;
}
label1.Text=txt;
</code>Sv: Om treeView och databas.
Jag har upptäckt ett problem med fööra problemet, lägga till child i treeview:n.
Den sortera kommunerna rätt, men länen är fel.
Det hjälper inte hur jag än försöker med SQL:en.
Går arrayen att sortera?Sv: Om treeView och databas.
Sv: Om treeView och databas.
Jag satt och irrade mig in i koden och kunde inte hitta lösning där så...
Tack för din underbara hjälp.