C#中,有關向TreeView加載多層結構數據,請問我如下設計是否合理
1、怎樣設計合理的表結構(我用的結構如下)
2、用什麼方法能快速加載數據表TreeView中(我使用的是遞歸,速度較慢)
表設計:
CREATE TABLE [dbo].[TSFunctionCollect](
[ParentID] [varchar](50) NOT NULL,
[FunctionID] [varchar](50) NOT NULL,
[FunctionName] [nvarchar](50) NOT NULL,
[Re] [nvarchar](255) NULL
 CONSTRAINT [PK_TSFunctionCollect] PRIMARY KEY CLUSTERED 
(
[FunctionID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
private void InitTreeView(TreeNodeCollection Nds, string GroupParentId)
{
    try
    {
        DataRow[] RowsGroup = DS.Tables["TSGroup"].Select("ParentID = '" + GroupParentId + "'");        //群組節點
        TreeNode NdGroup;
        //用戶節點
        TreeNode NdUser;
        //用戶行
        DataRow[] RowsUser = null;        foreach (DataRow aRowG in RowsGroup)
        {
            NdGroup = new TreeNode();
            NdGroup.Name = aRowG["GroupID"].ToString();
            NdGroup.Text = aRowG["GroupName"].ToString();
            NdGroup.Tag = "Group";//標明群組節點   
            NdGroup.ImageIndex = 0;
            NdGroup.SelectedImageIndex = 0;
            Nds.Add(NdGroup);            //根據群組獲取用戶
            RowsUser = DS.Tables["TSUser"].Select("GroupID = '" + aRowG["GroupID"].ToString() + "'");            foreach (DataRow aRowU in RowsUser)
            {
                NdUser = new TreeNode();
                NdUser.Name = aRowU["UserID"].ToString();
                NdUser.Text = aRowU["UserName"].ToString();
                NdUser.Tag = "User";//標明用戶節點
                NdUser.ImageIndex = 1;
                NdUser.SelectedImageIndex = 1;
                NdGroup.Nodes.Add(NdUser);
            }                              //递归调用遍历当前节点的子节点
            InitTreeView(NdGroup.Nodes, NdGroup.Name);            //如果群組下沒有登陸用戶,不顯示該組
            if (NdGroup.Nodes.Count <= 0)
            {
                NdGroup.Remove();
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

解决方案 »

  1.   

    我的表结构一般就是:ID,名称,上级id,其它一些可有可无的东西.
      

  2.   

    给你个递归建树的标准代码:
    //递归建树,通过RowFilter进行从顶级开始的筛选。cSupMenu_Id是上级编码.
            private void IntiTree(TreeNodeCollection myNode, string cSupMenu_Id)
            {
                DataView dv = new DataView();
                TreeNode TmpNode = new TreeNode();
                DataSet myds = CreateDataSet();
                dv.Table = myds.Tables[0];
                dv.RowFilter = "cSupMenu_ID='" + cSupMenu_Id + "'"; //筛选
                foreach(DataRowView drv in dv) 
                {
                    TmpNode = new TreeNode();
                    TmpNode.Name = drv["cMenu_Id"].ToString();
                    TmpNode.Text = drv["cMenu_Name"].ToString(); 
                    myNode.Add(TmpNode);
                    IntiTree(TmpNode.Nodes,TmpNode.Name);
                }        }