在进行ASP.NET开发时,经常需要将数据库中的数据以树形结构展示给用户。然而,ASP.NET的TreeView控件并没有直接提供从数据库加载数据的功能。因此,需要编写一些通用的代码来实现这一需求。
为了将数据库表绑定到TreeView菜单,开发了一个名为"DBTreeLoad"的类,它需要数据库的列信息、表信息和层级信息。以下是运行代码的步骤。
首先,需要创建一个"DBTreeLoad"类的实例。这个类将负责从数据库加载数据并构建TreeView的节点。
"SetNodeInfo"函数是核心输入函数,它需要以下参数:
例如,如果有一个数据库表,其列如下:
需要构建如下的层级结构:
"SetNodeInfo"函数的参数将如下设置:
// 对于第0层
process.SetNodeInfo(0, "Company", "CompanyName", true, GetRootCol());
// 对于第1层
process.SetNodeInfo(1, "Rate", "CompanyRate", true, "CompanyName");
process.SetNodeInfo(1, "Contracts", "CompanyContracts", true, "CompanyName");
// 对于第2层
process.SetNodeInfo(2, "Services", "ServiceCountries", true, "CompanyServices");
设置好节点信息后,可以使用核心函数LoadFromDataTable来加载数据。
LoadFromDataTable函数负责将数据从数据库加载到TreeView控件中。以下是该函数的实现:
public void LoadFromDataTable(TreeView tv)
{
string selectstatement = "select '" + GetRootValue() + "' as " + GetRootName() + ", * from " + TableName;
string whereclause = "";
string dataPath = "";
TreeNode parent = new TreeNode();
mtbl = new DataAccess().ExecuteSelectStatement(selectstatement, whereclause);
parent.Text = mtbl.Rows[0][0].ToString();
tv.Nodes.Add(parent);
for (int i = 0; i < mtbl.Rows.Count; i++)
{
for (int j = 0; j < Nodes.Count; j++)
{
dataPath = GetValuePath(i, j);
dataPath = dataPath + "/" + mtbl.Rows[i][Nodes[j].ColumnName].ToString();
TreeNode n_item = tv.FindNode(dataPath.Remove(0, 1));
if (n_item == null)
{
string p_datapath = dataPath.Substring(0, dataPath.LastIndexOf("/"));
TreeNode p_item = tv.FindNode(p_datapath.Remove(0, 1));
if (p_item == null)
{
p_item = new TreeNode(p_datapath.Substring(p_datapath.LastIndexOf("/") + 1));
p_datapath = p_datapath.Substring(0, p_datapath.LastIndexOf("/"));
// parent valuepath
(tv.FindNode(p_datapath.Remove(0, 1))).ChildNodes.Add(p_item);
}
if (!mtbl.Rows[i][Nodes[j].ColumnName].ToString().Equals(""))
{
n_item = new TreeNode();
n_item.Text = mtbl.Rows[i][Nodes[j].ColumnName].ToString();
p_item.ChildNodes.Add(n_item);
}
}
}
}
}