C#动态生成treeview方法
我的数据表字段如下
ID name parentID
相信我一写这个大家都只到我要问的问题了 我就不多说了 就是C#通过调用此表中有级联关系的数据 遍历的生成一个多层动态树形目录,最好能注释一下说明 我们用过 所以不大好理解 ,请教大虾们 小弟感激不尽...
[解决办法]
'根节点查询
Public Function RootNode() As DataRow()
Dim da As New DataAccessor
Dim dt As New DataTable
Dim ds As New DataSet
Dim dr As DataRelation
Dim Root As DataRow()
Try
da = DataAccessorFactory.GetDataAccessor("Xl_Zy_Tree.select")
ds = da.ExecuteQueryAsDataSet(da.PreparedSql)
dt = ds.Tables(0)
dr = New DataRelation("SD_JX_ZUOYELEIXING", dt.Columns("ZUOYELEIXINGBIANHAO"), dt.Columns("FUJIEDIANBIANHAO"))
dt.DataSet.Relations.Add(dr)
Root = dt.Select("FUJIEDIANBIANHAO = '001'")
Return Root
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Function
'FORM 窗体进行调用,使用的是递归
Private Function BulidTree()
Dim root As DataRow()
Dim logic As New LogicZuoYeLeiXingWeiHu
Dim model As New ZuoYeLeiXing
Dim node As TreeNode
Dim dr As DataRow
Dim child As DataRow()
root = logic.RootNode()
'递归添加根节点
For Each dr In root
node = New TreeNode
node.Text = CType(dr("ZUOYELEIXINGMINGCHENG"), String)
node.Tag = CType(dr("ZUOYELEIXINGBIANHAO"), String)
Me.tree_View.Nodes.Add(node)
child = dr.GetChildRows("SD_JX_ZUOYELEIXING")
If child.Length = 0 Then
Else
BulidTree(node, child)
End If
Next
End Function
Private Function BulidTree(ByVal tn As TreeNode, ByVal row As DataRow())
Dim newNode As TreeNode
Dim dr As DataRow
Dim child As DataRow()
Try
'递归添加子节点
For Each dr In row
newNode = New TreeNode
newNode.Text = CType(dr("ZUOYELEIXINGMINGCHENG"), String)
newNode.Tag = CType(dr("ZUOYELEIXINGBIANHAO"), String)
tn.Nodes.Add(newNode)
child = dr.GetChildRows("SD_JX_ZUOYELEIXING")
If child.Length = 0 Then
Else
BulidTree(newNode, child)
End If
Next
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Function
一直使用的一个方法,希望能帮助楼主
[解决办法]
哈哈 我刚好也在搞这个东西 这是一段小代码 是只动态绑定数据库中的表名 通过表名点击显示表
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetTree();
}
}
public void GetTree() // 这段是通过循环把表名添加到树的节点上 获取表名是select name from sysobjects WHERE xtype = 'U'
{
db.open(); //andstatus>=0 这段是数据库中所有表的表名
sqladap = new SqlDataAdapter(db.selectTable, db.sqlcon);
sqladap.Fill(dt);
for (int i = 0; i < dt.Rows.Count-5; i++)
{
TreeNode tn = new TreeNode();
tn.Text = dt.Rows[i]["name"].ToString();
TreeView1.Nodes.Add(tn);
}
}
public void bind() //这段是绑定 通过点击把表显示在GRIDVIEW上
{
string str = this.TreeView1.SelectedNode.Text;
db.open();
sqladap = new SqlDataAdapter("select * from " + str + "", db.sqlcon);
sqladap.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
db.close();
}
[解决办法]
如果你要把表名当做父节点 列名当做子节点的话在第一个FOR循环里面在添加个FOR循环来绑定子节点
for (int i = 0; i < dsCatalogManager.Tables[0].Rows.Count; i++)
{
TreeNode tnds = new TreeNode();
tnds.Value = dsCatalogManager.Tables[0].Rows[i]["standardid"].ToString();
tnds.Text = dsCatalogManager.Tables[0].Rows[i]["standardname"].ToString();
tnds.SelectAction = TreeNodeSelectAction.None;
DataSet dsModuleManager = new DataSet();
string strSqlModuleManager = "select * from standard_nationalstandard where standardid='" + dsCatalogManager.Tables[0].Rows[i][0].ToString().Trim() + "'";
FillData(dsModuleManager, "standard_nationalstandard", strSqlModuleManager);
if (dsModuleManager.Tables[0].Rows.Count > 0)
{
for (int j = 0; j < dsModuleManager.Tables[0].Rows.Count; j++)
{
//把模块表绑定到子节点,作为第二级节点
TreeNode tnModuleName = new TreeNode();
tnModuleName.Value = dsModuleManager.Tables[0].Rows[j]["standardid"].ToString();
tnModuleName.Text = dsModuleManager.Tables[0].Rows[j]["standardname"].ToString();
tnModuleName.SelectAction = TreeNodeSelectAction.None; //选定节点,事件为空
DataSet dsFunctionManager = new DataSet();
string strSqlFunctionManager = "select * from Standard_raliwaystandard where standardid='" + dsCatalogManager.Tables[0].Rows[i][0].ToString().Trim() + "'";
FillData(dsFunctionManager, "Standard_raliwaystandard", strSqlFunctionManager);
tnModuleName.ExpandAll();
tnModuleName.ChildNodes.Add(tnModuleName);
}
}
// 把目录名称绑定到TreeView控件,作为父节点
tnds.ExpandAll();
tnds.ChildNodes.Add(tnds);
}
这是在网上找的个例子 自己看下吧 添加子节点用的是tnds.ChildNodes.Add(tnds); 自己试试 很简单的。
[解决办法]
稽查点选择状态发生变化的
#region Treeview
private void tvCheckStation_AfterCheck(object sender, TreeViewEventArgs e)
{
try
{
if (e.Node == null)
return;
if (e.Action != TreeViewAction.Unknown) //把事件置为无效
{
if (e.Node.Checked)
{
CheckAllChild(e.Node);
CheckAllParent(e.Node);
}
else
{
ClearAllParent(e.Node);
ClearAllChild(e.Node);
}
}
}
catch
{ }
}
/// <summary>
/// 把所有父节点的Check去掉
/// </summary>
/// <param name="node"></param>
private void ClearAllParent(TreeNode node)
{
try
{
node.Checked = false;
if (node.Parent == null)
{
return;
}
else
{
ClearAllParent(node.Parent);
}
}
catch
{ }
}
/// <summary>
/// 把所有的子节点的Checked去掉
/// </summary>
/// <param name="node"></param>
private void ClearAllChild(TreeNode node)
{
try
{
node.Checked = false;
foreach (TreeNode tn in node.Nodes)
{
ClearAllChild(tn);
}
}
catch
{ }
}
/// <summary>
/// 把所有子接点部分加上勾
/// </summary>
/// <param name="node"></param>
private void CheckAllChild(TreeNode node)
{
try
{
node.Checked = true;
if (node.Nodes.Count > 0)
{
node.Expand();
for (int i = 0; i < node.Nodes.Count; i++)
{
CheckAllChild(node.Nodes[i]);
}
}
}
catch
{}
}
/// <summary>
/// 把所有父节点的Check去掉
/// </summary>
/// <param name="node"></param>
private void CheckAllParent(TreeNode node)
{
try
{
bool Checked = true;
if (node.Parent != null)
{
foreach (TreeNode tn in node.Parent.Nodes)
{
if (tn.Checked == false)
{
Checked = false;
break;
}
}
}
else
{
return;
}
if (Checked == true)
{
node.Parent.Checked = true;
CheckAllParent(node.Parent);
}
}
catch
{}
}
#endregion
[解决办法]
动态加载的,树的信息是丢在DATASET里面
/// <summary>
/// 加载稽查站点函数
/// </summary>
private void UpdateTreeView()
{
try
{
DataSet RecordSet = m_AIDConsoleOS.Fun_GetUpdateData();
if (RecordSet == null || !RecordSet.Tables.Contains("tb_CheckStation"))
return;
TreeNode tnRoot = tvCheckStation.Nodes[0];
AddNode(tnRoot, RecordSet);
}
catch
{
}
}
/// <summary>
/// 加载稽查树节点
/// </summary>
/// <param name="RecordSet"></param>
private void AddNode(TreeNode tnParent, DataSet RecordSet)
{
if (tnParent == null)
return ;
foreach (DataRow DR in RecordSet.Tables["tb_CheckStation"].Rows)
{
if (tnParent.Name == DR["ParentCheckStationNumber"].ToString())
{
TreeNode tnode = new TreeNode();
tnode.Text = DR["CheckStationName"].ToString();
tnode.Name = DR["CheckStationNumber"].ToString();
tnParent.Nodes.Add(tnode);
AddNode(tnode,RecordSet);
}
}
}