Problem in populating a treeview from database
-
Hellon every one.I have a table as follow; Node_Id Node_Name Parent_Id 1 Classified 0 2 Job 1 3 Matrimony 1 4 Property 1 5 ChildofJob1 2 6 Childofjob2 2 i am using following code,but its not giving me proper structure. My logic is,i add the node in to treeview at the same time i also check is this node present into Arraylist or not,if yes then i don't add that node if no then add the node to treeview as well as arraylist also.This procedure used for each and every node of tree. // For database operation OdbcConnection con = CodeClass.GetConnetion(); OdbcDataAdapter adapter1 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); OdbcDataAdapter adapter2 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); DataSet ds = new DataSet(); adapter1.Fill(ds, "Parent"); adapter2.Fill(ds, "Child"); ds.Relations.Add("relation", ds.Tables["Parent"].Columns["Node_Id"], ds.Tables["Child"].Columns["Parent_Id"]); // ======================================================================================== //I am takeing a arraylist in which i am going to maintan all nodes ArrayList list = new ArrayList(); string listitem; int flage1 = 0; int flage2 = 0; //============================= foreach (DataRow Prow in ds.Tables["Parent"].Rows) { // code for add parent nodes TreeNode pnode = new TreeNode(Prow["Node_Name"].ToString(), Prow["Parent_Id"].ToString()); //code for chech whather the node already present or not for (int i = 0; i < list.Count; i++) { if (pnode.Text.ToString() == list[i].ToString ()) { flage1++; break; } } if (flage1 > 0) { flage1 = 0; Response.Write("Node already exist"); } else { TreeView1.Nodes.Add(pnode); list.Add(pnode.Text.ToString()); } //code for add Child nodes // if (Prow.GetChildRows("relation") != null) { foreach (DataRow Crow in Prow.GetChildRows("relation")) { TreeNode Childnode = new TreeNode(Crow["Node_Name"].ToString()); pnode.ChildNodes.Add(Childnode); list.Add(Childnode.Text .ToString ()); } } }
-
Hellon every one.I have a table as follow; Node_Id Node_Name Parent_Id 1 Classified 0 2 Job 1 3 Matrimony 1 4 Property 1 5 ChildofJob1 2 6 Childofjob2 2 i am using following code,but its not giving me proper structure. My logic is,i add the node in to treeview at the same time i also check is this node present into Arraylist or not,if yes then i don't add that node if no then add the node to treeview as well as arraylist also.This procedure used for each and every node of tree. // For database operation OdbcConnection con = CodeClass.GetConnetion(); OdbcDataAdapter adapter1 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); OdbcDataAdapter adapter2 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); DataSet ds = new DataSet(); adapter1.Fill(ds, "Parent"); adapter2.Fill(ds, "Child"); ds.Relations.Add("relation", ds.Tables["Parent"].Columns["Node_Id"], ds.Tables["Child"].Columns["Parent_Id"]); // ======================================================================================== //I am takeing a arraylist in which i am going to maintan all nodes ArrayList list = new ArrayList(); string listitem; int flage1 = 0; int flage2 = 0; //============================= foreach (DataRow Prow in ds.Tables["Parent"].Rows) { // code for add parent nodes TreeNode pnode = new TreeNode(Prow["Node_Name"].ToString(), Prow["Parent_Id"].ToString()); //code for chech whather the node already present or not for (int i = 0; i < list.Count; i++) { if (pnode.Text.ToString() == list[i].ToString ()) { flage1++; break; } } if (flage1 > 0) { flage1 = 0; Response.Write("Node already exist"); } else { TreeView1.Nodes.Add(pnode); list.Add(pnode.Text.ToString()); } //code for add Child nodes // if (Prow.GetChildRows("relation") != null) { foreach (DataRow Crow in Prow.GetChildRows("relation")) { TreeNode Childnode = new TreeNode(Crow["Node_Name"].ToString()); pnode.ChildNodes.Add(Childnode); list.Add(Childnode.Text .ToString ()); } } }
Please post your code with proper format.
Abhijit Jana | Codeproject MVP Web Site : abhijitjana.net Don't forget to click "Good Answer" on the post(s) that helped you.
-
Hellon every one.I have a table as follow; Node_Id Node_Name Parent_Id 1 Classified 0 2 Job 1 3 Matrimony 1 4 Property 1 5 ChildofJob1 2 6 Childofjob2 2 i am using following code,but its not giving me proper structure. My logic is,i add the node in to treeview at the same time i also check is this node present into Arraylist or not,if yes then i don't add that node if no then add the node to treeview as well as arraylist also.This procedure used for each and every node of tree. // For database operation OdbcConnection con = CodeClass.GetConnetion(); OdbcDataAdapter adapter1 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); OdbcDataAdapter adapter2 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); DataSet ds = new DataSet(); adapter1.Fill(ds, "Parent"); adapter2.Fill(ds, "Child"); ds.Relations.Add("relation", ds.Tables["Parent"].Columns["Node_Id"], ds.Tables["Child"].Columns["Parent_Id"]); // ======================================================================================== //I am takeing a arraylist in which i am going to maintan all nodes ArrayList list = new ArrayList(); string listitem; int flage1 = 0; int flage2 = 0; //============================= foreach (DataRow Prow in ds.Tables["Parent"].Rows) { // code for add parent nodes TreeNode pnode = new TreeNode(Prow["Node_Name"].ToString(), Prow["Parent_Id"].ToString()); //code for chech whather the node already present or not for (int i = 0; i < list.Count; i++) { if (pnode.Text.ToString() == list[i].ToString ()) { flage1++; break; } } if (flage1 > 0) { flage1 = 0; Response.Write("Node already exist"); } else { TreeView1.Nodes.Add(pnode); list.Add(pnode.Text.ToString()); } //code for add Child nodes // if (Prow.GetChildRows("relation") != null) { foreach (DataRow Crow in Prow.GetChildRows("relation")) { TreeNode Childnode = new TreeNode(Crow["Node_Name"].ToString()); pnode.ChildNodes.Add(Childnode); list.Add(Childnode.Text .ToString ()); } } }
If your code works at all, it defines two levels, not three. I would imagine you can't do this in a way where you just bind to a datasource, or expect a table to work out the details for you. Your code is hideously inefficient on many fronts. It looks to me like it will add every node at the top level, also.
Christian Graus Driven to the arms of OSX by Vista. Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
-
Hellon every one.I have a table as follow; Node_Id Node_Name Parent_Id 1 Classified 0 2 Job 1 3 Matrimony 1 4 Property 1 5 ChildofJob1 2 6 Childofjob2 2 i am using following code,but its not giving me proper structure. My logic is,i add the node in to treeview at the same time i also check is this node present into Arraylist or not,if yes then i don't add that node if no then add the node to treeview as well as arraylist also.This procedure used for each and every node of tree. // For database operation OdbcConnection con = CodeClass.GetConnetion(); OdbcDataAdapter adapter1 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); OdbcDataAdapter adapter2 = new OdbcDataAdapter("select * from AdminAddNewItem ", con); DataSet ds = new DataSet(); adapter1.Fill(ds, "Parent"); adapter2.Fill(ds, "Child"); ds.Relations.Add("relation", ds.Tables["Parent"].Columns["Node_Id"], ds.Tables["Child"].Columns["Parent_Id"]); // ======================================================================================== //I am takeing a arraylist in which i am going to maintan all nodes ArrayList list = new ArrayList(); string listitem; int flage1 = 0; int flage2 = 0; //============================= foreach (DataRow Prow in ds.Tables["Parent"].Rows) { // code for add parent nodes TreeNode pnode = new TreeNode(Prow["Node_Name"].ToString(), Prow["Parent_Id"].ToString()); //code for chech whather the node already present or not for (int i = 0; i < list.Count; i++) { if (pnode.Text.ToString() == list[i].ToString ()) { flage1++; break; } } if (flage1 > 0) { flage1 = 0; Response.Write("Node already exist"); } else { TreeView1.Nodes.Add(pnode); list.Add(pnode.Text.ToString()); } //code for add Child nodes // if (Prow.GetChildRows("relation") != null) { foreach (DataRow Crow in Prow.GetChildRows("relation")) { TreeNode Childnode = new TreeNode(Crow["Node_Name"].ToString()); pnode.ChildNodes.Add(Childnode); list.Add(Childnode.Text .ToString ()); } } }
A tree is a basic data structure and everyone should know to work with that. When you add a node, you need to find the parent of that node using the parent id. To do this, keep a reference to the root node and iterate recursively until you find the node with the parent id. New node should be added as a child of this node. Above method has a O(n) complexity where n is the total number of nodes in a tree. An efficient approach will be to keep each node in an associative container with node id as key. When adding each item, look for a
TreeNode
object in this container. Here is a working code.void PopulateTreeView(DataTable dt, TreeView tv)
{
Dictionary<int, TreeNode> nodes = new Dictionary<int, TreeNode>();
TreeNode root = null;
foreach (DataRow row in dt.Rows)
{
int parentId = int.Parse(row["Parent_Id"].ToString());
int nodeId = int.Parse(row["Node_Id"].ToString());
string nodeName = row["Node_Name"].ToString();TreeNode node; if (nodes.TryGetValue(parentId, out node)) { TreeNode newNode = new TreeNode(nodeName); nodes.Add(nodeId, newNode); node.ChildNodes.Add(newNode); } else { node = new TreeNode(nodeName); nodes.Add(nodeId, node); node.ChildNodes.Add(node); if (parentId == 0) root = node; } } tv.Nodes.Add(root);
}
:)
Navaneeth How to use google | Ask smart questions
-
A tree is a basic data structure and everyone should know to work with that. When you add a node, you need to find the parent of that node using the parent id. To do this, keep a reference to the root node and iterate recursively until you find the node with the parent id. New node should be added as a child of this node. Above method has a O(n) complexity where n is the total number of nodes in a tree. An efficient approach will be to keep each node in an associative container with node id as key. When adding each item, look for a
TreeNode
object in this container. Here is a working code.void PopulateTreeView(DataTable dt, TreeView tv)
{
Dictionary<int, TreeNode> nodes = new Dictionary<int, TreeNode>();
TreeNode root = null;
foreach (DataRow row in dt.Rows)
{
int parentId = int.Parse(row["Parent_Id"].ToString());
int nodeId = int.Parse(row["Node_Id"].ToString());
string nodeName = row["Node_Name"].ToString();TreeNode node; if (nodes.TryGetValue(parentId, out node)) { TreeNode newNode = new TreeNode(nodeName); nodes.Add(nodeId, newNode); node.ChildNodes.Add(newNode); } else { node = new TreeNode(nodeName); nodes.Add(nodeId, node); node.ChildNodes.Add(node); if (parentId == 0) root = node; } } tv.Nodes.Add(root);
}
:)
Navaneeth How to use google | Ask smart questions
Good answer bro .. :thumbsup:
Abhishek Sur
My Latest Articles **Create CLR objects in SQL Server 2005 C# Uncommon Keywords Read/Write Excel using OleDB
**Don't forget to click "Good Answer" if you like to.
-
Good answer bro .. :thumbsup:
Abhishek Sur
My Latest Articles **Create CLR objects in SQL Server 2005 C# Uncommon Keywords Read/Write Excel using OleDB
**Don't forget to click "Good Answer" if you like to.
Thanks mate.
Navaneeth How to use google | Ask smart questions