第一篇博客,有不到之处和抄袭嫌疑还请海涵,都是项目时累计的经验,本人新手,之前从未接触计算机语言,偶然机会下学了半年。现在上班半年,开发路上还有很多需要学习的地方,在这里希望多多认识各路老师,多多指教!趁着周末,闲极无聊就写写博客,混个面熟,也许也还能帮助别人...何乐不为?
此代码段是从一次项目中,拖动节点保存到任意节点下的片段。开发时所用的控件为Telerik控件包,此Demo没有使用到,代码也是简化版,如果有朋友需要借鉴可发邮件或者微信索取...
直接上:
效果图
数据表结构
Code
public partial class Form1 : Form
{
//数据库对象
DBConsts db = new DBConsts();
//利用DataTable递归
private DataTable dt;
public Form1()
{
InitializeComponent();
//树形菜单节点右键事件
this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
//获取数据
dt = db.GetTable();
//递归
GetRootNode();
}
/// <summary>
/// 节点右键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//是否单击右键
if (e.Button == MouseButtons.Right)
{
//初始化菜单
ContextMenuStrip cm = new ContextMenuStrip();
//菜单选项
string[] menuItem = { "增加", "修改", "删除" };
//循环添加菜单选项
for (int i = 0; i < menuItem.Length; i++)
{
cm.Items.Add(menuItem[i]);
}
//菜单选项单击事件
cm.ItemClicked += new ToolStripItemClickedEventHandler(cm_ItemClicked);
//绑定菜单选项到树形菜单
this.treeView1.ContextMenuStrip = cm;
}
}
/// <summary>
/// 菜单选项单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void cm_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//判断是否选项为空(没试过,也许多余)
if (e.ClickedItem == null) return;
//判断选择项值
if (e.ClickedItem.Text == "增加")
{
MessageBox.Show("这里是添加事件,比如弹出窗口");
}
else if (e.ClickedItem.Text == "修改")
{
MessageBox.Show("这里是修改事件,比如弹出窗口");
}
else if (e.ClickedItem.Text == "删除")
{
MessageBox.Show("这里是删除事件,比如弹出窗口");
}
}
/// <summary>
/// 递归根节点
/// </summary>
public void GetRootNode()
{
int rootNodeId = 0;//根节点ID
DataRow[] rows = dt.Select("parent_node_id=" + rootNodeId + "");//找到匹配根节点ID的数据项
TreeNode tn = null;//声明树形菜单
//遍历根节点
foreach (DataRow dr in rows)
{
tn = new TreeNode();//实例化
tn.Tag = dr;//将节点属性绑定到Tag
tn.Text = dr["node_name"].ToString();//节点显示内容
tn.Name = dr["node_id"].ToString();//节点Name值
this.treeView1.Nodes.Add(tn);//添加节点到树形菜单
GetChildNode(tn);//递归子节点,传递根节点
}
}
/// <summary>
/// 递归子节点
/// </summary>
/// <param name="tn"></param>
public void GetChildNode(TreeNode tn)
{
DataRow dr = (DataRow)tn.Tag;//获取节点
int parentNodeId = (int)dr["node_id"];//定义节点编号
DataRow[] rows = dt.Select("parent_node_id=" + parentNodeId + "");//查找匹配节点
//遍历子节点
foreach (DataRow item in rows)
{
TreeNode tnode = new TreeNode();//实例化新节点
tnode.Tag = item;
tnode.Text = item["node_name"].ToString();
tnode.Name = item["node_id"].ToString();
tn.Nodes.Add(tnode);//将新节点添加到旧节点下
GetChildNode(tnode);//递归子节点的子节点
}
}
}