树TreeView控件与DataTable交互添加节点(最高效的方法)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                树TreeView控件与DataTable交互添加节点(最高效的方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                方法一:
View Code 本文轉載:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/#region?"讀取樹結點從Datatable"
????????///?<summary>
????????///?讀取樹結點從Datatable"
????????///?</summary>
????????///?<param?name="TreeView1">在填充的TreeView控件</param>
????????///?<param?name="DT">數據源DataTable</param>
????????///?<param?name="IsAppendNode">是在現有TreeView控件上添加結點,還是清空再添加</param>
????????///?<param?name="ParentNumberColumnIndex">在DataTable中,代表父節點編號的列索引</param>
????????///?<param?name="NumberColumnIndex">在DataTable中,代表當前節點編號的列索引</param>
????????///?<param?name="NameColumnIndex">在DataTable中,代表當前節點名稱的列索引</param>
????????///?<returns>True/False</returns>
????????public?bool?ReadNodesFromDataTable(TreeView?TreeView1,?DataTable?DT,?bool?IsAppendNode,?int?ParentNumberColumnIndex,?int?NumberColumnIndex,?int?NameColumnIndex)
????????{
????????????try
????????????{
????????????????if?(IsAppendNode?==?false)
????????????????{
????????????????????TreeView1.Nodes.Clear();
????????????????}
????????????????if?(DT?!=?null?&&?DT.Rows.Count?>?0)
????????????????{
????????????????????DataRow[]?DR?=?null;
????????????????????DR?=?DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName?+?"=''?or?"?+?DT.Columns[ParentNumberColumnIndex].ColumnName?+?"='0'?or?"?+?DT.Columns[ParentNumberColumnIndex].ColumnName?+?"?is?null");//先將頂級的查出來
????????????????????for?(int?I?=?0;?I?<=?DR.Length?-?1;?I++)//先將頂級的加入到TreeView中
????????????????????{
????????????????????????TreeNode?TNode?=?new?TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
????????????????????????TNode.Tag?=?DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
????????????????????????TNode.Name?=?DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
????????????????????????TreeView1.Nodes.Add(TNode);
????????????????????}
????????????????????for?(int?I?=?0;?I?<=?TreeView1.Nodes.Count?-?1;?I++)//再遞歸遍歷結點
????????????????????{
????????????????????????ForTreeNodeFormDT(TreeView1.Nodes[I],?DT,?ParentNumberColumnIndex,?NumberColumnIndex,?NameColumnIndex);
????????????????????}
????????????????}
????????????????return?false;
????????????}
????????????catch
????????????{
????????????????return?true;
????????????}
????????}
?
????????///?<summary>
????????///?從DT中遞歸遍歷出結點
????????///?</summary>
????????///?<param?name="TempNode">傳入的頂級結點</param>
????????///?<param?name="DT">保存TreeView結構的DataTable</param>
????????///?<param?name="ParentNumberColumnIndex">在DataTable中,代表父節點編號的列索引</param>
????????///?<param?name="NumberColumnIndex">在DataTable中,代表當前節點編號的列索引</param>
????????///?<param?name="NameColumnIndex">在DataTable中,代表當前節點名稱的列索引</param>
????????private?void?ForTreeNodeFormDT(TreeNode?TempNode,?DataTable?DT,?int?ParentNumberColumnIndex,?int?NumberColumnIndex,?int?NameColumnIndex)
????????{
????????????string?TTag?=?null;
????????????TTag?=?TempNode.Tag.ToString();
????????????DataRow[]?DR?=?null;
????????????DR?=?DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName?+?"='"?+?TTag?+?"'");
?
????????????for?(int?I?=?0;?I?<=?DR.Length?-?1;?I++)
????????????{
????????????????TreeNode?TNode?=?new?TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
????????????????TNode.Tag?=?DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
????????????????TNode.Name?=?DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
????????????????TempNode.Nodes.Add(TNode);
????????????}
?
????????????foreach?(TreeNode?aNode?in?TempNode.Nodes)
????????????{
????????????????ForTreeNodeFormDT(aNode,?DT,?ParentNumberColumnIndex,?NumberColumnIndex,?NameColumnIndex);
????????????}
????????}
????????#endregion
?
?
方法二:
?
做分類 經常會用到無限級別的分類? 先介紹一下數據庫的表結構
tid? 類別編號
tname 類別名稱
pid 父類編號
測試數據就不寫了,大家可以自己插入一下試試
查詢制定類別的 所有的子類?? sql 的 代碼
with as 遞歸查詢 alter proc proc_chaxun (@tid int ) as begin with tt as (select tid,tname,pid from dbo.t_goodsType where tid=@tidunion allselect t.tid,t.tname,t.pid from dbo.t_goodsType t inner join tton t.pid=tt.tid)select * from tt end查詢之后獲取記錄集?? 綁定到前臺的 TreeView 上面
遞歸進行添加 /// <summary>/// 給Tree 綁定數據 遞歸添加子節點/// </summary>/// <param name="dv">數據視圖</param>/// <param name="tnOld">添加數據的節點</param>public void TreeDataBind(DataView dv,TreeNode tnOld){TreeNode tnNew; //創建一個新的節點foreach (DataRowView drv in dv){//為新的借點設置屬性 tnNew = tnOld.Nodes.Add(drv["tname"].ToString());tnNew.Tag = drv["tid"];//過濾數據視圖 父類id = 上一級的tiddv.RowFilter = "pid=" + drv["tid"].ToString();//自己調用自己 TreeDataBind(dv, tnNew);}}調用的方法很簡單
調用 DataTable dtRet = (DataTable)dh.ExecProcRetObj(ep); DataView dv = new DataView(dtRet);dv.RowFilter = "pid=0"; TreeDataBind(dv, this.treeView1.Nodes.Add("商品類別"));效果
?
[知識分享] LINQ TO SQL 實現無限遞歸查詢
本文轉載:http://blog.csdn.net/q107770540/article/details/7708418
List<DetptInfo> lstDept = new List<DetptInfo> { new DetptInfo {ID=1,DeptName="公司",ParentID=0}, new DetptInfo {ID=10,DeptName="軟件中心",ParentID=1}, new DetptInfo {ID=11,DeptName="綜合辦公室",ParentID=1}, new DetptInfo {ID=100,DeptName="人力資源部",ParentID=11}, new DetptInfo {ID=101,DeptName="行政部",ParentID=11}, };public static List<DetptInfo> GetSonID(List<DetptInfo> lstDept, int p_id) { var query = from c in lstDept where c.ParentID == p_id select c;return query.Concat(query.SelectMany(t => GetSonID(lstDept, t.ID))).ToList(); }--調用:var query = GetSonID(lstDept, 0); Console.WriteLine("Id\tName\tParent");query.ToList().ForEach(q => Console.WriteLine("{0}\t{1}\t{2}", q.ID, q.DeptName, q.ParentID));
總結
以上是生活随笔為你收集整理的树TreeView控件与DataTable交互添加节点(最高效的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: OD使用教程13(迷途) - 调试篇13
- 下一篇: MVC文档地址
