wpf - Binding data to treeView c# -
i wish program worked this: 1.it takes data form ms sql 2.makes tree based on data(data rows) 3.i have few textboxex , want fill them data based on clicked node. i`ve made class sql connection:
class baza { private sqlconnection connection; string dbdir = "data source=cs24\\sqlexpress;user id=sa;password=alamakota;database=sharp;connection timeout=3"; public baza() { connection = new sqlconnection(); connection.connectionstring = dbdir; connection.open(); } public datatable get_data(string q) { datatable dt = new datatable(); sqldatareader dr ; sqlcommand sqlc = new sqlcommand(q); sqlc.connection = this.connection; dr = sqlc.executereader(); dt.load(dr); return dt; } } and treeview creator:
private void form1_load(object sender, eventargs e) { baza baza = new baza(); datatable dt = new datatable(); dt = baza.get_data("select * users order id asc"); foreach (datarow dr in dt.rows) { treenode node = new treenode(dr["name"].tostring() + " " + dr["surname"].tostring()); treeview1.nodes.add(node); } } i thought node should have id can use make data filling dont know how it. can me that?
i had same trouble , did :
(i had hierarchical data in columns parentid, isgroup, orderingroup)
create class treeviewitems
public class xtreeviewitem : inotifypropertychanged { public int id { get; set; } public string header { get; set; } public int parent; public list<xtreeviewitem > children { get; set; } public bool isgroup = false; public bool parentresolved = false; public float order {get;set;} public void notifypropertychanged(string info) { if (propertychanged != null) { propertychanged(this, new propertychangedeventargs(info)); } } public event propertychangedeventhandler propertychanged; }now make list sql data
private void loadtree() { observablecollection<xtreeviewitem> treesource = new observablecollection<xtreeviewitem>(); list<xtreeviewitem> buffer = new list<xtreeviewitem>(); foreach (datarow row in table.rows) { xtreeviewitem itm = new treeviewitem(); // load required heirarchial data buffer.add(itm); } (int = buffer.count - 1; >= 0; i--) { if (buffer[i].parentid != 0) { if (buffer[i].parentresolved) buffer.removeat(i); else { buffer[i].parentresolved = true; while (buffer.any(c => (c.parentid == buffer[i].menuid && !c.parentresolved))) { buffer[i].children.add(findchildren(buffer[i])); } xtreeviewitem parent = buffer.first(c => c.menuid == buffer[i].parentid); parent.children.add(buffer[i]); buffer[i].parent = parent; buffer.removeat(i); } } } // remaining items acts mainitems, add treesource foreach (xtreeviewitem x in buffer) { treesource.add(x); } treeview.itemssource = treesource; } xtreeviewitem findchildren(xmenuitem x) { list<xtreeviewitem > subbuffer = buffer.where(c => (c.parentid == x.menuid && !c.parentresolved)).tolist(); // if there is, of them list subbuffer = subbuffer.orderby(c => c.order).tolist(); // << crazy, fixes :p // order of them 'order' property int indx = buffer.indexof(subbuffer[0]); // first item after ordering buffer[indx].parentresolved = true; buffer[indx].parent = x; // changing parentresolved property prevent infinte loops while (buffer.any(c => (c.parentid == buffer[indx].menuid && !c.parentresolved))) // again checking if current child got other child. { buffer[indx].children.add(findchildren(buffer[indx])); // adding childs } return buffer[indx]; // return child }
in xaml : put treeview's itemtemplate :)
<treeview.itemtemplate> <hierarchicaldatatemplate itemssource="{binding children}"> <contentpresenter content="{binding header}" margin="2,0"/> </hierarchicaldatatemplate> </treeview.itemtemplate> this did work me :p , selected item, use :
xtreeviewitem selecteditem = (xtreeviewitem)treeview.selecteditem; make view update 'selecteditem'; .. :)
hope helped :)
** items may appear reversed. give list.reverse(); in point so, havent run code myself, anyway should work types, loading menuitems database , desplaying (useful if have multiple languages) :)
** im 18 yrs old :p havent got degree in cs, code came :) yea there might flaws works me :p
:)
Comments
Post a Comment