winform 点击动态treeview的节点加载对应的窗体,求解!!全部分数!! winform 左侧:treeview 工作区:panel 其中treeview动态生成,我想点击treeview中的节点,工作区中自动加载该节点对应的UserControl; 怎么做比较简洁。。要详细代码。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 存放树的类,这里可以读取数据库,按规范存放数据。 /// <summary> /// 实体类 客户信息树形视图展现 /// </summary> public class ZBZone:BasicCheck,ICloneable { public ZBZone() { } public object Clone() { return this.MemberwiseClone(); } private string parentid; /// <summary> /// 父节点名称 /// </summary> public string ParentID { get { return parentid; } set { if(value.ToString().IndexOf(',')!=-1) parentid = value; } } private string codeid; /// <summary> ///用户id号 /// </summary> public string CodeID { get { return codeid; } set { codeid = value; } } private string codename; /// <summary> ///用户名称 /// </summary> public string CodeName { get { return codename; } set { codename = value; } } }/// <summary> /// 构造父节点树 /// </summary> /// <param name="trc">树集合</param> /// <param name="lzb">实体集合</param> private void TreeViewLoad(TreeNodeCollection trc,List<ZBZone> lzb) { treeview_customer.Nodes.Clear(); foreach (ZBZone zb in lzb) { int icount = zb.ParentID.Split(',').Count(); if (icount == 2) { TreeNode tn = new TreeNode(zb.CodeName); tn.Tag = zb;//设置tag属性 tn.ImageIndex = 0; trc.Add(tn); treeview_customer.Nodes[0].ExpandAll(); } else { InitChildNode(trc[trc.Count - 1].Nodes,zb,zb.ParentID); } } } /// <summary> /// 递归构造子节点 /// </summary> /// <param name="trchild">父节点集合</param> /// <param name="strparent">parentid长度</param> /// <param name="name">节点名称</param> private void InitChildNode(TreeNodeCollection trchild, ZBZone zbz,string parentid) { string stemp = parentid; if (stemp.IndexOf(',') != 0) { stemp = stemp.Substring(0, stemp.LastIndexOf(',')); int icount = stemp.Split(',').Count(); if (icount ==2) { TreeNode tn1 = new TreeNode(zbz.CodeName); tn1.Tag = zbz; trchild.Add(tn1); } else { InitChildNode(trchild[trchild.Count - 1].Nodes, zbz, stemp); } } }//加载树 调用 List<ZBZone> zbzone = new List<ZBZone>(); zbzone.AddRange(new ZBZone[] {new ZBZone{ ParentID="1,1" ,CodeID="1", CodeName="ONE"}, new ZBZone{ ParentID="1,1,1" ,CodeID="2", CodeName="ONE-1"}, new ZBZone{ ParentID="1,1,1,2" ,CodeID="5", CodeName="ONE-1-2"}, new ZBZone{ ParentID="2,2" ,CodeID="6", CodeName="TWO"}}); TreeViewLoad(treeview_customer.Nodes, zbzone);//树名称 动态绑定事件在创建TreeView后treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected); private void MyAfterSelected(object sender, TreeViewEventArgs e) { //这里加载你的东西 } treeView.SelectedNode.Parent.Index; //这个是获取父节点ID然后通过这个ID获取数据库中的信息然后将获取到的信息添加到panel的容器里面以上所说的在同一事件内完成 就能达到自动加载的效果了 Node的Tag属性,你的控件名,然后反射实例 绑定treeView1时将要用的信息绑定在节点的tag属性中treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected);private void MyAfterSelected(object sender, TreeViewEventArgs e){通过选择不同节点获取tag中的信息来加载不同的UserControl} 在你的显示区域定义一个委托: public delegate void MainFormChange(UserControl WorkUserControl);同时在树菜单定义好事件,在使用的使用注册,实现方法为以下代码private void WorkAreaChange(UserControl UserCtl) { panel.Controls.Clear(); UserCtl.Dock = DockStyle.Fill; this.panel.Controls.Add(UserCtl); }至于在数菜单点击得到相应的要加载的控件,楼上已经说了可以通过反射来完成。 .net 中有类似xmldocument 的 json 类么 如何终止一个托管线程????? 怎么让一个button拖动后top,left不要出去panel1? 程序打包部署后,为什么报表功能不可用? C#大旗下的彩信开发,高手指点 如何用C#程序设置xp系统主题,不是桌面壁纸 急,关于语音聊天的问题,在线等........... 我在数据库中设置了左连接,但出来的数据行数比我左边的数据行数多20多行??? 关于画时序图,来帮下小弟吧 treeview为什么不能返回节点总数? 自定义了个combobox想在单击其他的地方的时候关闭下拉框 关于C#自定义类型的问题
/// 实体类 客户信息树形视图展现
/// </summary>
public class ZBZone:BasicCheck,ICloneable
{
public ZBZone() { }
public object Clone()
{
return this.MemberwiseClone();
}
private string parentid;
/// <summary>
/// 父节点名称
/// </summary>
public string ParentID
{
get { return parentid; }
set {
if(value.ToString().IndexOf(',')!=-1)
parentid = value;
}
} private string codeid;
/// <summary>
///用户id号
/// </summary>
public string CodeID
{
get { return codeid; }
set { codeid = value; }
} private string codename;
/// <summary>
///用户名称
/// </summary>
public string CodeName
{
get { return codename; }
set { codename = value; }
} }
/// <summary>
/// 构造父节点树
/// </summary>
/// <param name="trc">树集合</param>
/// <param name="lzb">实体集合</param>
private void TreeViewLoad(TreeNodeCollection trc,List<ZBZone> lzb)
{
treeview_customer.Nodes.Clear();
foreach (ZBZone zb in lzb)
{
int icount = zb.ParentID.Split(',').Count();
if (icount == 2)
{
TreeNode tn = new TreeNode(zb.CodeName);
tn.Tag = zb;//设置tag属性
tn.ImageIndex = 0;
trc.Add(tn);
treeview_customer.Nodes[0].ExpandAll();
}
else
{
InitChildNode(trc[trc.Count - 1].Nodes,zb,zb.ParentID);
}
}
}
/// <summary>
/// 递归构造子节点
/// </summary>
/// <param name="trchild">父节点集合</param>
/// <param name="strparent">parentid长度</param>
/// <param name="name">节点名称</param>
private void InitChildNode(TreeNodeCollection trchild, ZBZone zbz,string parentid)
{
string stemp = parentid;
if (stemp.IndexOf(',') != 0)
{
stemp = stemp.Substring(0, stemp.LastIndexOf(','));
int icount = stemp.Split(',').Count();
if (icount ==2)
{
TreeNode tn1 = new TreeNode(zbz.CodeName);
tn1.Tag = zbz;
trchild.Add(tn1);
}
else
{
InitChildNode(trchild[trchild.Count - 1].Nodes, zbz, stemp);
}
}
}//加载树 调用
List<ZBZone> zbzone = new List<ZBZone>();
zbzone.AddRange(new ZBZone[]
{new ZBZone{ ParentID="1,1" ,CodeID="1", CodeName="ONE"},
new ZBZone{ ParentID="1,1,1" ,CodeID="2", CodeName="ONE-1"},
new ZBZone{ ParentID="1,1,1,2" ,CodeID="5", CodeName="ONE-1-2"},
new ZBZone{ ParentID="2,2" ,CodeID="6", CodeName="TWO"}});
TreeViewLoad(treeview_customer.Nodes, zbzone);//树名称
treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected); private void MyAfterSelected(object sender, TreeViewEventArgs e)
{
//这里加载你的东西
}
然后通过这个ID获取数据库中的信息
然后将获取到的信息添加到panel的容器里面以上所说的在同一事件内完成 就能达到自动加载的效果了
treeView1.AfterSelect += new TreeViewEventHandler(MyAfterSelected);private void MyAfterSelected(object sender, TreeViewEventArgs e)
{
通过选择不同节点获取tag中的信息来加载不同的UserControl
}
同时在树菜单定义好事件,在使用的使用注册,实现方法为以下代码
private void WorkAreaChange(UserControl UserCtl)
{
panel.Controls.Clear();
UserCtl.Dock = DockStyle.Fill;
this.panel.Controls.Add(UserCtl);
}至于在数菜单点击得到相应的要加载的控件,楼上已经说了可以通过反射来完成。