Hi
I am trying to populate TreeView from database but I am having problems with sub child nodes
Why "Durres" doesnt show up as child of "Tirana" and why "Shkoder" doesnt show up as child of "Durres"?
Database code
CREATE TABLE [dbo].[TopBill] ( [srNo] INT NOT NULL IDENTITY, [Pid] INT NULL, [PName] VARCHAR (50) NULL, [PDetails] NCHAR (10) DEFAULT (NULL) NULL, [cId] INT NULL, [Cname] VARCHAR (50) NULL, [Cqty] INT DEFAULT (NULL) NULL, CONSTRAINT [PK_TopBill] PRIMARY KEY CLUSTERED ([srNo] ASC) );
Database data
C# code
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class Index : System.Web.UI.Page { Boolean m_bNodeFound; Boolean intNodeFound; string sValuepath; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { using (var connection = new SqlConnection("Data Source=(localdb)\\ProjectsV13;Initial Catalog=gab;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False")) { string com = "Select * from dbo.TopBill"; SqlDataAdapter adpt = new SqlDataAdapter(com, connection); DataTable dt = new DataTable(); adpt.Fill(dt); connection.Open(); TreeNode root = new TreeNode(); root = new TreeNode(); root.Text = dt.Rows[0][5].ToString(); root.Value = dt.Rows[0][5].ToString(); TreeView1.Nodes.Add(root); for (int i = 0; i < dt.Rows.Count; i++) { //make NodeNotFound at each row m_bNodeFound = false; //root as it is TreeNode tn = root; //get NodeName by cName string nodeName = dt.Rows[i][5].ToString(); //Check if it is not null, to skip errors if (nodeName != null && nodeName != "") { //MainNodecollections TreeNodeCollection nodes = TreeView1.Nodes; //Check if node already exists in Treeview FindNodeInHierarchy(nodeName); //If not found then continue if (!m_bNodeFound) { //If node is root node if (dt.Rows[i][2].ToString() == "" || dt.Rows[i][2].ToString() == null) { TreeNode root2 = new TreeNode(); root2.Text = dt.Rows[i][5].ToString(); root2.Value = dt.Rows[i][5].ToString(); TreeView1.Nodes.Add(root2); } //Check if node is child node else if (CheckRowsAllValues(dt.Rows[i][1].ToString(), dt)) { //Find New Root of child node TreeNode NewRoot = FindRoot(dt.Rows[i][1].ToString(), dt, root); //if New root is not empty if (NewRoot != null) { TreeNode root2 = new TreeNode(); root2.Text = dt.Rows[i][5].ToString(); root2.Value = dt.Rows[i][5].ToString(); //append child node(current value) with new root NewRoot.ChildNodes.Add(root2); } } } } } } } } private TreeNode FindRoot(string v, DataTable dt, TreeNode tNode) { string expression = "cId = " + v; DataRow[] foundRows; foundRows = dt.Select(expression); //Find node using Id of table row TreeNode tn = TreeView1.FindNode(foundRows[0][0].ToString()); //if not found, search using Name if (tn == null && foundRows[0][5].ToString() != "") { var value = foundRows[0][5].ToString(); TreeNode searchedNode = null; //search node by Value(City Name) by looping each node foreach (TreeNode node in TreeView1.Nodes) { if (searchedNode == null) { searchedNode = SearchNode(node, value); if (searchedNode == null) { foreach (TreeNode childNode in node.ChildNodes) { searchedNode = SearchNode(childNode, value); if (searchedNode != null) tn = searchedNode; } } else { break; } } else { break; } } tn = searchedNode; } return tn; } //Search Node code private TreeNode SearchNode(TreeNode node, string searchText = null) { if (node.Text == searchText) return node; TreeNode tn = null; foreach (TreeNode childNode in node.ChildNodes) { tn = SearchNode(childNode); if (tn != null) break; } if (tn != null) node.Expand(); return tn; } private bool CheckRowsAllValues(string v, DataTable dt) { string expression = "cId = " + v; DataRow[] foundRows; foundRows = dt.Select(expression); if (foundRows.Count() > 0) { return true; } else { return false; } } private void FindNodeByValue(string strValue) { // If the TreeView control contains any root nodes, perform a // preorder traversal of the tree and display the text of each node. if (TreeView1.Nodes.Count > 0) { // Iterate through the root nodes in the Nodes property. for (int i = 0; i < TreeView1.Nodes.Count; i++) { // Display the nodes. DisplayChildNodeText(TreeView1.Nodes[i], strValue); } } } void DisplayChildNodeText(TreeNode node, string strValue) { // Display the node's text value. //Message.Text += node.Text + "<br />"; if (strValue == node.Text.ToString()) { sValuepath = node.ValuePath; intNodeFound = true; } // Iterate through the child nodes of the parent node passed into // this method and display their values. for (int i = 0; i < node.ChildNodes.Count; i++) { DisplayChildNodeText(node.ChildNodes[i], strValue); } if (intNodeFound) return; } private void FindNodeInHierarchy(string strSearchValue) { // If the TreeView control contains any root nodes, perform a // preorder traversal of the tree and display the text of each node. if (TreeView1.Nodes.Count > 0) { // Iterate through the root nodes in the Nodes property. for (int i = 0; i < TreeView1.Nodes.Count; i++) { // Display the nodes. CheckChildNodeText(TreeView1.Nodes[i], strSearchValue); } } } void CheckChildNodeText(TreeNode node, string strValue) { // Display the node's text value. //Message.Text += node.Text + "<br />"; if (strValue == node.Text.ToString()) { m_bNodeFound = true; } // Iterate through the child nodes of the parent node passed into // this method and display their values. for (int i = 0; i < node.ChildNodes.Count; i++) { DisplayChildNodeText(node.ChildNodes[i], strValue); } if (m_bNodeFound) return; } } }
The result
What code should do or what I want in this case