来平安不是很久,公司的业务逻辑理解得并不清晰,只是做些项目里的小功能,来的第一天就开始做winform中的tree的所有节点的增删改查的操作,代码很基础,但还是想写下来留个纪念,毕竟技术不高,只能实现简单的逻辑,但我相信时间,时间会把我简单的代码变得高深,变得强大
public partial class FunctionsMenuForm : Form //一个tree窗体
{
#region 该类的构造函数
public FunctionsMenuForm()
{
InitializeComponent();
}
#endregion
public void Initialize() //初始化方法
{
_FunMenuTree.AfterSelect += new TreeViewEventHandler(_Tree_AfterSelect);//自定义挂接一个事件
_FunMenuTree.ExpandAll(); //展开所有树节点
if (_FunMenuTree.SelectedNode == null ||
GetButtonType(_FunMenuTree.SelectedNode.ImageIndex) != TouchButtonType.Menu)
{
_AddChidButton.Enabled = false;
}
}
#region 具体实现这个挂接的事件
void _Tree_AfterSelect(object sender, TreeViewEventArgs e)
{
if (GetButtonType(e.Node.ImageIndex) == TouchButtonType.Menu)
{
_AddChidButton.Enabled = true;
}
else
{
_AddChidButton.Enabled = false;
}
}
#endregion
#region 定义一个方法,获取图标的索引
private int GetImageIndex(TouchButtonType buttonType)
{
return (int)buttonType;
}
#endregion
#region 根据索引再获取它的值
private TouchButtonType GetButtonType(int imageIndex)
{
return (TouchButtonType)imageIndex;
}
#endregion
#region 实现子节点上移的方法
private void SetUPTree(TreeNode node)
{
//如果没有子节点,上面也没有同级的节点
if (node == null)
{
MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (node.PrevNode == null)
{
MessageBox.Show("已经是第一个了,不能移动。", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
TreeNode newNode = (TreeNode)node.Clone();//复制树节点和以此树节点为根的整个子树
if (node.Parent != null)//父节点不为空
{
node.Parent.Nodes.Insert(node.PrevNode.Index, newNode);
}
else
{
node.TreeView.Nodes.Insert(node.PrevNode.Index, newNode);
}
//添加一个新的节点,这个新的节点时复制的
node.TreeView.SelectedNode = newNode;
this._FunMenuTree.Nodes.Remove(node);
}
#endregion
#region 实现节点下移的方法
private void SetDownTree(TreeNode node)
{
//如果没有子节点,上面也没有同级的节点
if (node == null)
{
MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (node.NextNode == null)
{
MessageBox.Show("已经是最后一个了,不能移动。", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
TreeNode newNode = (TreeNode)node.Clone();//复制树节点和以此树节点为根的整个子树
if (node.Parent != null)//父节点不为空
{
node.Parent.Nodes.Insert(node.NextNode.Index + 1, newNode);
}
else
{
node.TreeView.Nodes.Insert(node.NextNode.Index + 1, newNode);
}
node.TreeView.SelectedNode = newNode;
this._FunMenuTree.Nodes.Remove(node);
}
#endregion
#region 点击“上移”按钮,触发的事件
private void _RemoveUP_Click(object sender, EventArgs e)
{
SetUPTree(this._FunMenuTree.SelectedNode);
}
#endregion
#region 点击"下移"按钮,触发的事件
private void _RemoveDown_Click(object sender, EventArgs e)
{
//调用下移的方法
SetDownTree(this._FunMenuTree.SelectedNode);
}
#endregion
#region 点击"添加根节点"按钮,触发的事件
private void _AddRootButton_Click(object sender, EventArgs e)
{
var form = new AddTreeForm(TreeOperation.RootTree);
//给事件追加一个方法
form.ReturnAddRoot += new EventHandler(form_ReturnAdd);
//模式窗体打开子窗体
form.ShowDialog();
}
#endregion
#region 具体实现添加根节点的方法
void form_ReturnAdd(object sender, EventArgs e)
{
AddTreeForm form = sender as AddTreeForm;
TreeNode node = new TreeNode();
node.Text = form.TreeNodeName;
node.ImageIndex = GetImageIndex(form.ButtonType);
node.SelectedImageIndex = GetImageIndex(form.ButtonType);
this._FunMenuTree.Nodes.Add(node);
this._FunMenuTree.SelectedNode = node;
form.Close();
}
#endregion
#region 点击"添加子节点"触发的事件
private void _AddChidButton_Click(object sender, EventArgs e)
{
TreeNode node = _FunMenuTree.SelectedNode;
if (node == null)
{
MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
//当它选中的是菜单按钮,可以添加子节点
if (GetButtonType(_FunMenuTree.SelectedNode.ImageIndex) == TouchButtonType.Menu)
{
var form = new AddTreeForm(TreeOperation.ChildTree);
//给事件追加一个方法
form.ReturnAddChild += new EventHandler(form_ReturnAddChild);
form.ShowDialog();
}
}
#endregion
#region 具体实现添加子节点的方法
void form_ReturnAddChild(object sender, EventArgs e)
{
AddTreeForm form = sender as AddTreeForm;
var node = new TreeNode();
node.Text = form.TreeNodeName; //添加的节点的名称
node.ImageIndex = GetImageIndex(form.ButtonType); //图片索引
node.SelectedImageIndex = GetImageIndex(form.ButtonType);//当前选中节点的索引==图片索引
//给树的当前选中的节点添加子节点
this._FunMenuTree.SelectedNode.Nodes.Add(node);
//添加子节点后,树的当前选中节点的子节点都展开
this._FunMenuTree.SelectedNode.Expand();
this._FunMenuTree.SelectedNode = node;
form.Close();
}
#endregion
#region 点击修改按钮,触发的事件
private void _UpdateButton_Click(object sender, EventArgs e)
{
//获取当前选中的节点,如果为空
TreeNode node = _FunMenuTree.SelectedNode;
if (node == null)
{
MessageBox.Show("请选择您要操作的按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
//实例化子窗体,同时把枚举类型修改的操作传给它
var form = new AddTreeForm(TreeOperation.EditTree);
form.Initialize(node.Text, GetButtonType(node.ImageIndex));
//给事件挂接一个方法
form.ReturnEditTree += new EventHandler(form_ReturnEditTree);
//子窗体以模式窗体打开
form.ShowDialog();
}
#endregion
#region 具体实现修改的方法
void form_ReturnEditTree(object sender, EventArgs e)
{
AddTreeForm form = sender as AddTreeForm;
TreeNode node = _FunMenuTree.SelectedNode;
if (node.Nodes.Count > 0 && form.ButtonType != TouchButtonType.Menu)
{
MessageBox.Show("只有菜单按键能有子按键", "按键菜单设置", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
//获取到了选中节点的名称,并放在封装的属性中
node.Text = form.TreeNodeName;
//获取图片索引
node.ImageIndex = GetImageIndex(form.ButtonType); //图片索引
node.SelectedImageIndex = GetImageIndex(form.ButtonType);
_AddChidButton.Enabled = form.ButtonType == TouchButtonType.Menu;
form.Close();
}
#endregion
#region 点击"删除"按钮触发的事件
private void _DelButton_Click(object sender, EventArgs e)
{
if (this._FunMenuTree.SelectedNode != null)
{
this._FunMenuTree.SelectedNode.Remove();
}
}
#endregion
#region 点击"确定"按钮
private void _OkButton_Click(object sender, EventArgs e)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
#endregion
#region 点击取消按钮触发的事件
private void _CancelButton_Click(object sender, EventArgs e)
{
Close();
}
#endregion
/// <summary>
/// 加载功能按键菜单树
/// </summary>
/// <param name="_TouchButtons"></param>
public void InitFuncMenuTree(List<ITouchButton> _TouchButtons)
{
foreach (ITouchButton btn in _TouchButtons)
{
TreeNode node = new TreeNode();
node.Text = (btn as ITouchComponent).TouchTheme.Text;
node.ImageIndex = GetImageIndex(btn.ButtonType);
node.SelectedImageIndex = GetImageIndex(btn.ButtonType);
switch (btn.ButtonType)
{
case TouchButtonType.Menu:
AddChildNodes(node, btn as MenuButton);
_FunMenuTree.Nodes.Add(node);
break;
default:
_FunMenuTree.Nodes.Add(node);
break;
}
}
}
/// <summary>
/// 添加菜单按键子节点
/// </summary>
/// <param name="parentNode"></param>
/// <param name="menuButton"></param>
private void AddChildNodes(TreeNode parentNode, MenuButton menuButton)
{
foreach (ITouchButton btn in menuButton.ChildButtons)
{
TreeNode node = new TreeNode();
node.Text = (btn as ITouchComponent).TouchTheme.Text;
node.ImageIndex = GetImageIndex(btn.ButtonType);
node.SelectedImageIndex = GetImageIndex(btn.ButtonType);
switch (btn.ButtonType)
{
case TouchButtonType.Menu:
AddChildNodes(node, btn as MenuButton);
parentNode.Nodes.Add(node);
break;
default:
parentNode.Nodes.Add(node);
break;
}
}
}
/// <summary>
/// 获取功能按键菜单树
/// </summary>
/// <returns></returns>
public List<ITouchButton> GetFuncMenuTree()
{
List<ITouchButton> _TouchButtons = new List<ITouchButton>();
foreach (TreeNode node in _FunMenuTree.Nodes)
{
switch (GetButtonType(node.ImageIndex))
{
case TouchButtonType.Ticket:
TicketButton ticket = new TicketButton();
ticket.TouchTheme.Text = node.Text;
_TouchButtons.Add(ticket);
break;
case TouchButtonType.Function:
FunctionButton function = new FunctionButton();
function.TouchTheme.Text = node.Text;
_TouchButtons.Add(function);
break;
case TouchButtonType.Navigate:
NavigateButton navigate = new NavigateButton();
navigate.TouchTheme.Text = node.Text;
_TouchButtons.Add(navigate);
break;
case TouchButtonType.Menu:
MenuButton menu = new MenuButton();
menu.TouchTheme.Text = node.Text;
AddChildButtons(node, menu);
_TouchButtons.Add(menu);
break;
default :
break;
}
}
return _TouchButtons;
}
/// <summary>
/// 菜单按键添加子按键
/// </summary>
/// <param name="parentNode"></param>
/// <param name="menuButton"></param>
private void AddChildButtons(TreeNode parentNode, MenuButton menuButton)
{
foreach (TreeNode childNode in parentNode.Nodes)
{
switch (GetButtonType(childNode.ImageIndex))
{
case TouchButtonType.Ticket:
TicketButton ticket = new TicketButton();
ticket.TouchTheme.Text = childNode.Text;
menuButton.ChildButtons.Add(ticket);
break;
case TouchButtonType.Function:
FunctionButton function = new FunctionButton();
function.TouchTheme.Text = childNode.Text;
menuButton.ChildButtons.Add(function);
break;
case TouchButtonType.Navigate:
NavigateButton navigate = new NavigateButton();
navigate.TouchTheme.Text = childNode.Text;
menuButton.ChildButtons.Add(navigate);
break;
case TouchButtonType.Menu:
MenuButton menu = new MenuButton();
menu.TouchTheme.Text = childNode.Text;
AddChildButtons(childNode, menu);
menuButton.ChildButtons.Add(menu);
break;
default:
break;
}
}
}
}
以上的代码功能是我在平安的第一个任务,我是在同事的帮助下完成的,做完以后还是觉得学到了些东西的,原来能力就是这样一点一点储蓄起来的,继续加油!。。。。