一、效果图(整个项目源码)
二、实现
首先在工具箱中拖拽一个ContextMenuStrip控件,对其进行编辑,双击编辑好的菜单项会自动生成对应的点击事件。
在对应的TreeView控件的属性中找到ContextMenuStrip,选择刚编辑好的ContextMenuStrip控件名。
//editMenuTree为TreeView控件名
private void menuAddChildItem_Click(object sender, EventArgs e)//添加子菜单
{
if (editMenuTree.SelectedNode != null)
{
FrmAddOrEditMenuItem addMenuItem = new FrmAddOrEditMenuItem();//跳转到另一个窗口进行数据的输入
addMenuItem.menuid = Convert.ToInt32(editMenuTree.SelectedNode.Name);//将选择结点的id传过去,id是作为结点的Name
addMenuItem.flag = 0;//表示添加子菜单操作
addMenuItem.ShowDialog();
editMenuTree.Nodes.Clear();//先将TreeView中结点清空
DisplayTreeView();//重新显示菜单树,相对于刷新
editMenuTree.ExpandAll();//结点全部展开
}
}
private void menuDeleteItem_Click(object sender, EventArgs e)//删除菜单
{
if (editMenuTree.SelectedNode != null)
{
if (editMenuTree.SelectedNode.Nodes.Count == 0)//当前结点不存在子节点可以删除
{
TreeNode parent = editMenuTree.SelectedNode.Parent;//获取当前选中结点的父结点
DialogResult dr = MessageBox.Show("确认删除当前菜单?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dr == DialogResult.OK)
{
string sql = "delete from t_menu where id = " + Convert.ToInt32(editMenuTree.SelectedNode.Name);
int result = db.ExecuteSql(sql);
if (result == 1)//该菜单已删除,判断其父菜单下是否还有子菜单,更新父菜单的isendnode
{
if (parent != null && parent.Nodes.Count == 0)
{
string sql1 = "update t_menu set isendnode = 1 where id =" + Convert.ToInt32(parent.Name);
if (db.ExecuteSql(sql1) != 1)
{
MessageBox.Show("更新数据库isendnode字段失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
editMenuTree.Nodes.Clear();
DisplayTreeView();
editMenuTree.ExpandAll();
}
else
{
MessageBox.Show("删除失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show("该菜单下含有子菜单,不可删除!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
private void menuEditItem_Click(object sender, EventArgs e)//编辑菜单
{
if (editMenuTree.SelectedNode != null)
{
FrmAddOrEditMenuItem editMenu = new FrmAddOrEditMenuItem();
editMenu.flag = 1;//表示编辑结点操作
editMenu.menuid = Convert.ToInt32(editMenuTree.SelectedNode.Name);
editMenu.Text = "编辑菜单项";
editMenu.ShowDialog();
editMenuTree.Nodes.Clear();
DisplayTreeView();
editMenuTree.ExpandAll();
}
}
private void menuAddParentItem_Click(object sender, EventArgs e)//添加一级菜单
{
if (editMenuTree.SelectedNode != null)
{
FrmAddOrEditMenuItem addParentItem = new FrmAddOrEditMenuItem();
addParentItem.flag = 2;//表示添加一级菜单
addParentItem.menuid = 0;
addParentItem.Text = "添加一级菜单";
addParentItem.ShowDialog();
editMenuTree.Nodes.Clear();
DisplayTreeView();
editMenuTree.ExpandAll();
}
}