樹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=@tid
        union all
        select t.tid,t.tname,t.pid from dbo.t_goodsType  t inner join tt
        on 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 = 上一級的tid
                    dv.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));

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM