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、怎樣設計合理的表結構(我用的結構如下)
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;
}
}
//递归建树,通过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);
} }