TreeView数据绑定的方法
?? TreeView數據綁定的方法
?? 最近作一個.net程序中涉及到權限的分配和管理,要把分為不同層次的權限從數據庫中讀出在樹形控件TreeView中顯示出來。這里采取的是首先取出數據放在DataTable中,然后在遞歸查詢中根據不同的filter條件得到對應樹杈需要的數據。這里使用類似的行政區劃的數據表,數據表為:
CREATE TABLE [dbo].[QuHua] (
?[ID] [int] IDENTITY (1, 1) NOT NULL ,--自增的標記列
?[NAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,--行政區劃的名稱
?[ParentID] [int] NOT NULL --行政區劃的上一級區劃ID,最高級區劃的上一級默認為0
) ON [PRIMARY]
GO
?
---插入測試數據
Insert Into dbo.QuHua (NAME,ParentID) Values ('北京',0)
Insert Into dbo.QuHua (NAME,ParentID) Values ('山東',0)
Insert Into dbo.QuHua (NAME,ParentID) Values ('河北',0)
Insert Into dbo.QuHua (NAME,ParentID) Values ('海淀',1)
Insert Into dbo.QuHua (NAME,ParentID) Values ('中關村',4)
Insert Into dbo.QuHua (NAME,ParentID) Values ('濟寧',2)
Insert Into dbo.QuHua (NAME,ParentID) Values ('曲阜',6)
Insert Into dbo.QuHua (NAME,ParentID) Values ('濟南',2)
???????? /// <summary>
??????? /// 根據遞歸查詢結果動態生成TreeView
??????? /// 由于算法效率問題,不適合數據量的情況
??????? /// </summary>
???????? private void CreateTreeView()
????????? {
???????????? string connetion = "Data Source=. ;Initial Catalog=MIS_New;Integrated Security=True";
???????????? using (SqlConnection cn = new SqlConnection(connetion))
????????????? {
???????????????? cn.Open();
???????????????? SqlDataAdapter da = new SqlDataAdapter("select * from QuHua", cn);
???????????????? DataTable dt = new DataTable();
???????????????? da.Fill(dt);
???????????????? //首先把第一級的行政區劃取出生成TreeView的節點
???????????????? //作為遞歸運算的入口
???????????????? CreateTreeViewRecursive(treeView1.Nodes, dt, 0);
???????????? }
?
???????? }
????????? /// <summary>
???????? /// 遞歸查詢
???????? /// </summary>
???????? /// <param name="nodes">TreeView的節點集合</param>
???????? /// <param name="dataSource">數據源</param>
???????? /// <param name="parentid">上一級行政區劃的標識碼</param>
???????? private void CreateTreeViewRecursive(TreeNodeCollection nodes,DataTable dataSource,int parentid)
????????? {
???????????? string filter;
???????????? filter = string.Format("parentid={0}", parentid);
???????????? DataRow[] drarr = dataSource.Select(filter);
???????????? TreeNode node;
???????????? foreach (DataRow dr in drarr)
????????????? {
???????????????? node = new TreeNode();
???????????????? node.Text = (string)dr["name"];
???????????????? node.Tag = (int)dr["id"];
???????????????? nodes.Add(node);
???????????????? CreateTreeViewRecursive(node.Nodes,dataSource,(int)node.Tag);
???????????? }
?
???????? }
?
?
/// <summary>
??? /// 生成樹
??? /// </summary>
??? /// <param name="id">父ID。加載根結點時為0</param>
??? /// <param name="tn">父結點。加載根結點時為null</param>
??? private void setTreeNode(int id, TreeNode tn)
??? {
??????? //DataView dvTree = new DataView(dt); //dt為<所有數據的datatable。每次都在這個datatable上篩選數據
??????? //dvTree.RowFilter = "ParentID=" + id.ToString();
?
??????? //for (int i = 0; i < dvTree.Count; i++)
??????? //{
??????? //??? TreeNode newNode = new TreeNode();
??????? //??? newNode.Text = dvTree[i]["LocationName"].ToString().Trim();
?? ?????//??? LocationData locaType = new LocationData();
??????? //??? locaType.ID = (int)dvTree[i]["ID"]; //ID
??????? //??? locaType.LocationID = (int)dvTree[i]["LocationID"]; //位置ID
??????? //??? locaType.ParentID = (int)dvTree[i]["ParentID"]; //父ID
???? ???//??? locaType.LocationTypeID = (int)dvTree[i]["LocationTypeID"]; //位置類型ID
??????? //??? locaType.LocationName = dvTree[i]["LocationName"].ToString(); //位置名稱
??????? //??? locaType.LocationDesc = dvTree[i]["LocationDesc"].ToString(); //位置描述??
??????? //??? newNode.Tag = locaType;
??????? //??? if (tn == null)
??????? //??? {
??????? //??????? this.TreeView1.Nodes.Add(newNode);
??????? //??????? setTreeNode(Int32.Parse(dvTree[i]["LocationID"].ToString().Trim()), newNode);
??????? //??? }
??????? //??? else
??????? //??? {
??????? //??????? tn.Nodes.Add(newNode);
??????? //??????? setTreeNode(Int32.Parse(dvTree[i]["LocationID"].ToString().Trim()), newNode);
??????? //??? }
??????? //}
??? }
?
??? public void AddTree(int ParentID, TreeNode pNode, TreeView tv)
??? {
??????? DataTable dt = (DataTable)this.ViewState["treeTable"];
??????? //從ViewState["treeTable"]取上面的那個表,不從數據庫中取。以免過多循環讀取數據庫。
??????? DataView dvTree = new DataView(dt);
??????? dvTree.RowFilter = "[ParentID] = " + ParentID;
?
??????? foreach (DataRowView Row in dvTree)
??????? {
??????????? TreeNode Node = new TreeNode();
??????????? if (pNode == null)
??????????? {??? //添加根節點
??????????????? Node.Text = Row["AgentName"].ToString();
??????????????? Node.Value = Row["AgentTree"].ToString();
????????? ??????tv.Nodes.Add(Node);
??????????????? Node.NavigateUrl = "AgentOrg.aspx";
??????????????? Node.Target = "MainFrame";
??????????????? AddTree(Int32.Parse(Row["id"].ToString()), Node, TreeView1);
??????????? }
??????????? else
??????????? {?? //?添加當前節點的子節點
??????????????? Node.Text = Row["AgentName"].ToString();
??????????????? Node.Value = Row["id"].ToString();
??????????????? pNode.ChildNodes.Add(Node);
??????????????? Node.NavigateUrl = "AgentOrg.aspx";
??????????????? Node.Target = "MainFrame";
????? ??????????AddTree(Int32.Parse(Row["id"].ToString()), Node, TreeView1);???? //再次遞歸
??????????? }
??????? }
??? }
總結
以上是生活随笔為你收集整理的TreeView数据绑定的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创内容的17PK飞鸽传书
- 下一篇: 第三计 借口计