private System.Windows.Forms.TreeView menuTree;

/// 
/// 判断用户是否有权限操作该菜单
/// 2011-10-20 Aiice
/// 
public bool HasMenu(string code)
{
	cn.myeol.www.PosService  xmlService = new cn.myeol.www.PosService ();
	xmlService.Url=Global.g_WebServiceURL;
	string SQL = "SELECT * FROM RoleMenus WHERE CanView = 1 AND RoleID IN (SELECT RoleID FROM UserRoles WHERE UserID = (SELECT UserID FROM Users WHERE UserName = '"+Global.g_UserName+"')) AND MenuID = '"+code+"'";
	DataSet ds = xmlService.GetDataSetFromSystemDatabase(Global.g_sTokenKey,SQL);
	if(ds.Tables[0].Rows.Count >0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

/// 
/// 树形菜单单击事件
/// 2011-10-19 Aiice
/// 
private void MenuTreeClick(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
	TreeNode cNode = menuTree.SelectedNode;
	if(cNode.Text=="退出系统")
	{
		this.Close();
	}
	else
	{
		try
		{
                                      //Action属性为自定义树形 所以这里要强制转换为QzTreeNode
			string action = ((Smart.Warehouse.frmMain.QzTreeNode)(cNode)).Action;
			LoadForms("Smart.Warehouse.exe",action);
		}
		catch
		{
			//Nothing TODO
		}
	}
}

/// 
/// 查询是否有子form如果有激活显示
/// 2011-10-20 Aiice
/// 
///
子form类名称
private bool ShowChildrenForm(string p_ChildrenFormText)
{
	int i;
	string[] FormNames = p_ChildrenFormText.Split('.');
	string FormName = FormNames[FormNames.Length-1];
	for (i = 0; i < this.MdiChildren.Length; i++)
	{
		if (this.MdiChildren[i].Name == FormName)
		{
			this.MdiChildren[i].Activate();
			return true;
		}
	}
	return false;
}

/// 
/// 动态载入form类
/// 2011-10-19 Aiice
/// 
///
form对应的dll文件或exe文件
///
form类的全称 包括命名空间名称
private void LoadForms(string assFile ,string FormName)
{
	if(!ShowChildrenForm(FormName))
	{
		Assembly assembly =Assembly.GetExecutingAssembly();
		if(assFile!="")
		{
			assembly = Assembly.LoadFrom(assFile);
		}
		Type t = assembly.GetType(FormName);
		Form fm = (Form)Activator.CreateInstance(t);
		fm.MdiParent =this;
		fm.Show();
	}
}

/// 
/// 获取所有节点展开后的高度总和
/// 2011-10-21 Aiice
/// 
private int AddHeight(TreeNodeCollection nodes)
{
	int intHeight = 0;
	foreach (TreeNode node in nodes)
	{
		intHeight += node.Bounds.Height;
		if (node.Nodes.Count > 0)
		{
			intHeight += AddHeight(node.Nodes);
		}
	}
	return intHeight;
}

private void frmMain_Load(object sender, System.EventArgs e)
{
	//动态生成树形菜单
	cn.myeol.www.PosService  xmlService = new cn.myeol.www.PosService ();
	xmlService.Url=Global.g_WebServiceURL;
	string SQL = "SELECT Caption,ID  FROM Menus WHERE ParentID IN (SELECT ID FROM Menus WHERE Code = 'SMC01-CS01') ORDER BY ID DESC";
	DataSet ds = xmlService.GetDataSetFromSystemDatabase(Global.g_sTokenKey,SQL);	

	foreach(DataRow dr in ds.Tables[0].Rows)
	{
		if(HasMenu(dr[1].ToString()))
		{
			TreeNode rootNode = new TreeNode(dr[0].ToString());
			menuTree.Nodes.Add(rootNode);
			string sSQL = "SELECT Caption,ID,EditSrc,ImageURL FROM Menus WHERE ParentID = '"+dr[1].ToString()+"' ORDER BY ID DESC";
			DataSet sds = xmlService.GetDataSetFromSystemDatabase(Global.g_sTokenKey,sSQL);

			foreach(DataRow sdr in sds.Tables[0].Rows)
			{
				if(HasMenu(sdr[1].ToString()))
				{
					//此时采用了自定义的TreeNode对象我要添加属性
					QzTreeNode secondNode = new QzTreeNode();
					secondNode.Logo = "";
					secondNode.Text = sdr[0].ToString();
					secondNode.Action = sdr[2].ToString();
					secondNode.ImageIndex = int.Parse(sdr[3].ToString());
					rootNode.Nodes.Add(secondNode);
				}
			}
		}
	}
	//添加退出系统按钮
	TreeNode exitNode = new TreeNode("退出系统");
	exitNode.ImageIndex = 19;
	exitNode.ForeColor= Color.Red;
	exitNode.SelectedImageIndex = 19;
	menuTree.Nodes.Add(exitNode); 

	menuTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(MenuTreeClick);
	menuTree.ExpandAll();
	//自动改变trueview高度
	int intHeight = AddHeight(menuTree.Nodes);
	menuTree.Height = intHeight;
}

/// 
/// 自定义TreeNode类
/// 
public class QzTreeNode:TreeNode
{
	public string Logo;
	public string Action;

	public QzTreeNode QzParent
	{
		get{ return (QzTreeNode) base.Parent; }
	}

	public override object Clone()
	{
		QzTreeNode copy =(QzTreeNode)base.Clone();
		copy.Logo = Logo;
		copy.Action =Action;
		return copy;
	}
}

最后效果如果: