RaUI/Source/ryControls/TreeXML/ctlTreeView.cs
2020-11-28 15:03:57 +08:00

906 lines
33 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using ryCommon;
namespace ryControls
{
/// <summary>
/// 树形控件,用于分类用
/// </summary>
public partial class CtlTreeView : TreeView
{
private NodeItem StringToNodeItem(string tag)
{
ryCommon.Storage mStor = new ryCommon.Storage(tag);
mStor.SelectNodeBySet();
NodeItem item = new NodeItem(mStor.GetAttrValue("keys"), mStor.GetAttrValue("pwd"), mStor.GetAttrValue("user"));
return item;
}
private string NodeItemToString(object Tag)
{
if (Tag != null)
{
NodeItem item = (NodeItem)Tag;
ryCommon.Storage mStor = new ryCommon.Storage();
mStor.SelectNodeBySet();
mStor.SetAttrValue("keys", item.Keys);
mStor.SetAttrValue("pwd", item.Pwd);
mStor.SetAttrValue("user", item.AuthUser);
return mStor.XMLText;
}
return "";
}
XmlDocument xmlDoc = new XmlDocument();//定义一个XML文档对象
private string m_FirstShowText = "所有数据";
/// <summary>
/// 显示在第一位的名称
/// </summary>
[Description("显示在第一位的名称")]
public string T_FirstShowText
{
get { return m_FirstShowText; }
set { m_FirstShowText = value; }
}
private bool m_ShowMenu = true;
/// <summary>
/// 是否显示菜单
/// </summary>
[Description("是否显示菜单")]
public bool T_ShowMenu
{
get { return m_ShowMenu; }
set { m_ShowMenu = value; }
}
/// <summary>
/// 树形控件
/// </summary>
public CtlTreeView()
{
InitializeComponent();
menuAddGroup.Click += new EventHandler(MenuAddGroup_Click);
menuEditGroup.Click += new EventHandler(MenuEditGroup_Click);
menuDelGroup.Click += new EventHandler(MenuDelGroup_Click);
menuGoPreGroup.Click += new EventHandler(MenuGoPreGroup_Click);
menuSetPwd.Click += new EventHandler(MenuSetPwd_Click);
menuSetAuthUser.Click += new EventHandler(MenuSetAuthUser_Click);
menuGoNextGroup.Click += new EventHandler(MenuGoNextGroup_Click);
this.MouseClick += new MouseEventHandler(CtlTreeView_MouseClick);
this.ContextMenuStrip = contextMenuStrip1;
this.ItemDrag += new ItemDragEventHandler(CtlTreeView_ItemDrag);
this.DragEnter += new DragEventHandler(CtlTreeView_DragEnter);
this.DragDrop += new DragEventHandler(CtlTreeView_DragDrop);
this.DragOver += new DragEventHandler(CtlTreeView_DragOver);
this.AfterCheck += new TreeViewEventHandler(CtlTreeView_AfterCheck);
this.HotTracking = true;
this.HideSelection = false;
}
void MenuSetAuthUser_Click(object sender, EventArgs e)
{
TreeNode tn = this.SelectedNode;
if (tn == null) { return; }
if (tn.Parent == null) { return; }
if (OnBeforeSetAuth != null)
{
bool Cancel = false;
OnBeforeSetAuth(this, ref Cancel);
if (Cancel) { return; }
}
TreeXML.FrmAuthUser frm = new TreeXML.FrmAuthUser();
frm.txtAuthUser.Text = GetNodeItem(tn).AuthUser;
frm.txtAuthUser.DoubleClick += new EventHandler(TxtAuthUser_DoubleClick);
if (frm.ShowDialog(this) == DialogResult.OK)
{
SetNodeItemForUser(tn, frm.txtAuthUser.Text);
OnDataChange?.Invoke(this, new EventArgs());
}
}
void MenuSetPwd_Click(object sender, EventArgs e)
{
TreeNode tn = this.SelectedNode;
if (tn == null) { return; }
if (tn.Parent == null) { return; }
if (OnBeforeSetPwd != null)
{
bool Cancel = false;
OnBeforeSetPwd(this, ref Cancel);
if (Cancel) { return; }
}
TreeXML.FrmChangePwd frm = new TreeXML.FrmChangePwd()
{
oldPwd = GetNodeItem(tn).Pwd
};
if (frm.ShowDialog(this) == DialogResult.OK)
{
SetNodeItem(tn, frm.NewPwd);
OnDataChange?.Invoke(this, new EventArgs());
}
}
private void TreeParentChecked(TreeNode node, bool state)
{
TreeNode tn = node;
while (true)
{
tn = tn.Parent;
if (tn == null)
{
break;
}
else
{
tn.Checked = state;
}
}
}
void CtlTreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
if (this.CheckBoxes)
{
if (e.Node.Checked && e.Action == TreeViewAction.ByMouse)
{
//ctlTreeView1.setChildNodeCheckedState(e.Node, true);
TreeParentChecked(e.Node, true);
this.SetChildNodeCheckedState(e.Node, true);
}
else if (!e.Node.Checked && e.Action == TreeViewAction.ByMouse)
{
//ctlTreeView1.setChildNodeCheckedState(e.Node, true);
bool isChecked = false;
TreeNode tn = e.Node.Parent;
if (tn != null)
{
for (int i = 0; i < tn.Nodes.Count; i++)
{
if (tn.Nodes[i].Checked) { isChecked = true; break; }
}
}
if (!isChecked)
{
TreeParentChecked(e.Node, false);
}
this.SetChildNodeCheckedState(e.Node, false);
}
}
}
void CtlTreeView_DragOver(object sender, DragEventArgs e)
{
}
/// <summary>
/// 判断指定节点是否是目标节点的子节点
/// </summary>
/// <param name="parent"></param>
/// <param name="child"></param>
/// <param name="isIncludeMe"></param>
/// <returns></returns>
public bool IsChildNode(TreeNode parent, TreeNode child,bool isIncludeMe)
{
if (parent == child && isIncludeMe) { return true; }
TreeNode tn=child.Parent;
while (true)
{
if (tn == parent)
{
return true;
}
else
{
tn = tn.Parent;
if (tn == null)
{
break;
}
}
}
return false;
}
void CtlTreeView_DragDrop(object sender, DragEventArgs e)
{
//获得拖放中的节点
TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
//根据鼠标坐标确定要移动到的目标节点
Point pt;
TreeNode targeNode;
pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
targeNode = this.GetNodeAt(pt);
//如果目标节点无子节点则添加为同级节点,反之添加到下级节点的未端
TreeNode NewMoveNode = (TreeNode)moveNode.Clone();
if (!IsChildNode(moveNode, targeNode, false) && moveNode != targeNode)
{
//if (targeNode.Nodes.Count == 0)
//{
// targeNode.Parent.Nodes.Insert(targeNode.Index, NewMoveNode);
//}
//else
//{
OnBeforeDataChange?.Invoke(this, new EventArgs());
targeNode.Nodes.Insert(targeNode.Nodes.Count, NewMoveNode);
//}
//移除拖放的节点
moveNode.Remove();
//更新当前拖动的节点选择
this.SelectedNode = NewMoveNode;
//展开目标节点,便于显示拖放效果
this.ExpandAll();
OnDataChange?.Invoke(this, new EventArgs());
}
}
void CtlTreeView_DragEnter(object sender, DragEventArgs e)
{
if (OnBeforeEditGroup != null)
{
bool Cancel = false;
OnBeforeEditGroup(this, ref Cancel);
if (Cancel) { return; }
}
if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
void CtlTreeView_ItemDrag(object sender, ItemDragEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
}
void TxtAuthUser_DoubleClick(object sender, EventArgs e)
{
TextBox ct = (TextBox)sender;
string User = ct.Text;
bool Cancel=false;
OnAuthUserSelect?.Invoke(this,ref User,ref Cancel);
if (!Cancel)
{
((TextBox)sender).Text = User;
}
}
/// <summary>
/// 判断当前节点,当前用户是否有权限访问
/// </summary>
/// <param name="tn"></param>
/// <param name="user"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public bool IsHaveAuth(TreeNode tn,string user,string pwd)
{
NodeItem ni = GetNodeItem(tn);
if(ni.AuthUser=="" || (";"+ni.AuthUser+";").IndexOf(";"+user+";")>=0)
{
if(ni.Pwd=="" || ni.Pwd==pwd)
{
return true;
}
}
return false;
}
void CtlTreeView_MouseClick(object sender, MouseEventArgs e)
{
try
{
TreeView tv = sender as TreeView;
TreeNode select = tv.GetNodeAt(e.Location);
if (select != null)
{
//如果选择节点不是null就设置为你的“选取结点”
tv.SelectedNode = select;
}
}
catch{}
}
/// <summary>
/// 权限事件
/// </summary>
/// <param name="sender"></param>
/// <param name="User"></param>
/// <param name="Cancel"></param>
public delegate void AuthUserHandler(object sender, ref string User,ref bool Cancel);
/// <summary>
/// 选择权限用户时发生
/// </summary>
[Description("选择权限用户时发生")]
public event AuthUserHandler OnAuthUserSelect;
/// <summary>
/// 数据变化时发生
/// </summary>
[Description("数据变化时发生")]
public event EventHandler OnDataChange;
/// <summary>
/// 数据变化前发生
/// </summary>
[Description("数据变化前发生")]
public event EventHandler OnBeforeDataChange;
/// <summary>
/// 操作事件
/// </summary>
/// <param name="sender"></param>
/// <param name="Cancel"></param>
public delegate void OptHandler(object sender, ref bool Cancel);
/// <summary>
/// 在添加分组前发生
/// </summary>
[Description("在添加分组前发生")]
public event OptHandler OnBeforeAddGroup;
/// <summary>
/// 在修改分组前发生
/// </summary>
[Description("在修改分组前发生")]
public event OptHandler OnBeforeEditGroup;
/// <summary>
/// 在删除分组前发生
/// </summary>
[Description("在删除分组前发生")]
public event OptHandler OnBeforeDelGroup;
/// <summary>
/// 在设置密码前发生
/// </summary>
[Description("在设置密码前发生")]
public event OptHandler OnBeforeSetPwd;
/// <summary>
/// 在设置权限前发生
/// </summary>
[Description("在设置权限前发生")]
public event OptHandler OnBeforeSetAuth;
void MenuGoNextGroup_Click(object sender, EventArgs e)
{
if (null == this.SelectedNode)
{
return;
}
TreeNode node = this.SelectedNode;
TreeNode nextNode = node.NextNode;
if (null != nextNode)
{
TreeNode newNode = (TreeNode)node.Clone();
OnBeforeDataChange?.Invoke(this, new EventArgs());
if (null == node.Parent)
{
this.Nodes.Insert(nextNode.Index + 1, newNode);
}
else
{
node.Parent.Nodes.Insert(nextNode.Index + 1, newNode);
}
node.Remove();
this.SelectedNode = newNode;
OnDataChange?.Invoke(this, new EventArgs());
}
}
void MenuGoPreGroup_Click(object sender, EventArgs e)
{
if (null == this.SelectedNode)
{
return;
}
TreeNode node = this.SelectedNode;
TreeNode prevNode = node.PrevNode;
if (null != prevNode)
{
TreeNode newNode = (TreeNode)node.Clone();
OnBeforeDataChange?.Invoke(this, new EventArgs());
if (null == node.Parent)
{
this.Nodes.Insert(prevNode.Index, newNode);
}
else
{
node.Parent.Nodes.Insert(prevNode.Index, newNode);
}
node.Remove();
this.SelectedNode = newNode;
OnDataChange?.Invoke(this, new EventArgs());
}
}
void MenuDelGroup_Click(object sender, EventArgs e)
{
if (this.SelectedNode == null) { return; }
if (this.SelectedNode.Parent == null) { return; }
if (MessageBox.Show("是否真的要删除?一旦删除就不可恢复!\r\n备注删除分组时不会删除该分组包含的内容。", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No) { return; }
if (OnBeforeDelGroup != null)
{
bool Cancel = false;
OnBeforeDelGroup(this, ref Cancel);
if (Cancel) { return; }
}
OnBeforeDataChange?.Invoke(this, new EventArgs());
this.SelectedNode.Remove();
OnDataChange?.Invoke(this, new EventArgs());
}
void MenuEditGroup_Click(object sender, EventArgs e)
{
if (OnBeforeEditGroup != null)
{
bool Cancel = false;
OnBeforeEditGroup(this, ref Cancel);
if (Cancel) { return; }
}
if (this.SelectedNode == null) { return; }
if (this.SelectedNode.Parent == null) { return; }
TreeXML.frmAddTree frm = new TreeXML.frmAddTree()
{
T_IsAdd = 0,
imageList1 = this.ImageList,
T_SelectText = this.SelectedNode.Text,
T_SelectTag = GetNodeItem(this.SelectedNode).Keys,
T_ImageIndex = this.SelectedNode.ImageIndex
};
if (frm.ShowDialog(this) == DialogResult.OK)
{
OnBeforeDataChange?.Invoke(this, new EventArgs());
this.SelectedNode.Text = frm.T_SelectText;
SetNodeItemForKeys(this.SelectedNode, frm.T_SelectTag);
this.SelectedNode.ImageIndex = frm.T_ImageIndex;
//this.SelectedNode.StateImageIndex = frm.T_ImageIndex;
this.SelectedNode.SelectedImageIndex = frm.T_ImageIndex;
OnDataChange?.Invoke(this, new EventArgs());
}
}
void MenuAddGroup_Click(object sender, EventArgs e)
{
if (OnBeforeAddGroup != null)
{
bool Cancel = false;
OnBeforeAddGroup(this, ref Cancel);
if (Cancel) { return; }
}
if (this.SelectedNode == null) { return; }
TreeXML.frmAddTree frm = new TreeXML.frmAddTree()
{
imageList1 = this.ImageList,
T_IsAdd = 1
};
if (frm.ShowDialog(this) == DialogResult.OK)
{
OnBeforeDataChange?.Invoke(this, new EventArgs());
TreeNode new_child = new TreeNode()
{
Text = frm.T_SelectText
};
SetNodeItemForKeys(new_child, GetNewKey());
new_child.ImageIndex = frm.T_ImageIndex;
new_child.SelectedImageIndex = frm.T_ImageIndex;
//new_child.StateImageIndex = frm.T_ImageIndex;
this.SelectedNode.Nodes.Add(new_child);
this.ExpandAll();
OnDataChange?.Invoke(this, new EventArgs());
}
}
/// <summary>
/// 获取新的关键词分类
/// </summary>
/// <returns></returns>
private string GetNewKey()
{
Dictionary<string, int> dict = new Dictionary<string, int>();
DiGui(Nodes[0]);
int i = 0;
while(true)
{
if(!dict.ContainsKey("N"+i.ToString()))
{
return "N" + i.ToString();
}
i++;
}
void DiGui(TreeNode tn)
{
//
foreach (TreeNode tnSub in tn.Nodes)
{
NodeItem item = GetNodeItem(tnSub);
if(!dict.ContainsKey(item.Keys))
{ dict.Add(item.Keys, 1); }
DiGui(tnSub);
}
}
}
/// <summary>
/// 根据id获取节点
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public XmlElement GetNodeInfoById(string id)
{
//根据指定路径获取节点
XmlElement element = null;
XmlNode xmlNode = xmlDoc.SelectSingleNode("root/list[@id='" + id + "']");
element = (XmlElement)xmlNode;
return element;
}
/// <summary>
/// 根据节点获取节点信息
/// </summary>
/// <param name="tn"></param>
/// <returns></returns>
public NodeItem GetNodeItem(TreeNode tn)
{
if (tn.Tag != null && tn.Tag.ToString() != "") { return (NodeItem)tn.Tag; }
else { tn.Tag= new NodeItem("", "", ""); return (NodeItem)tn.Tag; }
}
/// <summary>
/// 设置节点信息
/// </summary>
/// <param name="tn"></param>
/// <param name="ni"></param>
public void SetNodeItem(TreeNode tn,NodeItem ni)
{
NodeItem item = GetNodeItem(tn);
OnBeforeDataChange?.Invoke(this, new EventArgs());
item = ni;
}
/// <summary>
/// 设置节点关键词和密码
/// </summary>
/// <param name="tn"></param>
/// <param name="Keys"></param>
/// <param name="pwd"></param>
public void SetNodeItem(TreeNode tn,string Keys,string pwd)
{
NodeItem item = GetNodeItem(tn);
OnBeforeDataChange?.Invoke(this, new EventArgs());
item.Keys = Keys;
item.Pwd = pwd;
}
/// <summary>
/// 设置节点密码
/// </summary>
/// <param name="tn"></param>
/// <param name="pwd"></param>
public void SetNodeItem(TreeNode tn,string pwd)
{
NodeItem item = GetNodeItem(tn);
OnBeforeDataChange?.Invoke(this, new EventArgs());
item.Pwd = pwd;
}
/// <summary>
/// 设置节点关键词
/// </summary>
/// <param name="tn"></param>
/// <param name="Keys"></param>
public void SetNodeItemForKeys(TreeNode tn, string Keys)
{
NodeItem item = GetNodeItem(tn);
OnBeforeDataChange?.Invoke(this, new EventArgs());
item.Keys = Keys;
}
/// <summary>
/// 设置节点用户
/// </summary>
/// <param name="tn"></param>
/// <param name="User"></param>
public void SetNodeItemForUser(TreeNode tn, string User)
{
NodeItem item = GetNodeItem(tn);
OnBeforeDataChange?.Invoke(this, new EventArgs());
item.AuthUser = User;
}
/// <summary>
/// RecursionTreeControl:表示将XML文件的内容显示在TreeView控件中
/// </summary>
/// <param name="xmlNode">将要加载的XML文件中的节点元素</param>
/// <param name="nodes">将要加载的XML文件中的节点集合</param>
private void RecursionTreeControl(XmlNode xmlNode, TreeNodeCollection nodes)
{
foreach (XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
{
TreeNode new_child = new TreeNode();
try
{
new_child.Text = (node.Attributes["Value"].Value == "null" ? "" : node.Attributes["Value"].Value) ;
try
{
var ImageIndex= node.Attributes["ImageIndex"].Value.ToInt();
var ImageKey = node.Attributes["ImageKey"];
var ImageKey_Str = ImageKey==null?"": ImageKey.Value;
if (ImageKey_Str == "")
{
new_child.ImageIndex = ImageIndex;
new_child.SelectedImageIndex = new_child.ImageIndex;
}
else
{
if (ImageList != null && ImageList.Images.Keys.Contains(ImageKey_Str))
{
new_child.ImageKey = ImageKey_Str;
new_child.SelectedImageKey = new_child.ImageKey;
}
else {
new_child.ImageIndex = ImageIndex;
new_child.SelectedImageIndex = new_child.ImageIndex;
}
}
//new_child.StateImageIndex = new_child.ImageIndex;
}
catch { }
//
NodeItem item = StringToNodeItem(node.Attributes["Tag"].Value);
new_child.Tag = item;
}
catch
{
new_child.Tag = null;
}
switch (node.HasChildNodes)//判断是否存在子节点如果有继续递归
{
case true:
RecursionTreeControl(node, new_child.Nodes);
break;
case false: break;
}
nodes.Add(new_child);//写入
}
}
/// <summary>
/// 把XML文本载入到列表中
/// </summary>
/// <param name="XMLText"></param>
public void LoadFromXMLText(string XMLText)
{
try
{
base.Nodes.Clear();
xmlDoc.RemoveAll();
xmlDoc.LoadXml(XMLText);//加载XML文件
TreeNode node = base.Nodes.Add(m_FirstShowText);
node.Tag = null;
RecursionTreeControl(xmlDoc.DocumentElement, node.Nodes);//在TreeView控件中显示内容
base.ExpandAll();//展开TreeView控件中的所有项
}
catch
{
xmlDoc.LoadXml("<root></root>");//加载XML文件
base.Nodes.Add(m_FirstShowText).Tag="";
}
if(base.Nodes.Count>0)
{
SelectedNode = base.Nodes[0];
}
}
/// <summary>
/// 把XML文件载入到列表中
/// </summary>
/// <param name="Path"></param>
public void LoadFromFile(string Path)
{
base.Nodes.Clear();
xmlDoc.Load(Path);//加载XML文件
RecursionTreeControl(xmlDoc.DocumentElement, base.Nodes.Add(m_FirstShowText).Nodes);//在TreeView控件中显示内容
base.ExpandAll();//展开TreeView控件中的所有项
}
private void TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode)
{
XmlNode Xmlroot;
XmlElement xmlnode;
Xmlroot = xmlDoc.SelectSingleNode("root");
foreach (TreeNode node in nodes)
{
xmlnode = xmlDoc.CreateElement("list");
xmlnode.SetAttribute("Value", node.Text);
xmlnode.SetAttribute("Tag", NodeItemToString(node.Tag));
xmlnode.SetAttribute("ImageIndex", node.ImageIndex.ToString());
xmlnode.SetAttribute("ImageKey", node.ImageKey);
ParXmlnode.AppendChild(xmlnode);
if (node.Nodes.Count > 0)
{
TransTreeSav(node.Nodes, xmlnode);
}
}
}
/// <summary>
/// 将列表保存为xml文本
/// </summary>
/// <returns></returns>
public string SaveToXmlText()
{
xmlDoc = new XmlDocument();
//-------遍历树的各个故障节点同时添加节点至XML
xmlDoc.LoadXml("<root></root>");
XmlElement Xmlnode = xmlDoc.CreateElement("list");
XmlNode Xmlroot = xmlDoc.SelectSingleNode("root");
//------遍历原treeview控件并生成相应的XML
TransTreeSav(base.Nodes[0].Nodes, (XmlElement)Xmlroot);
return xmlDoc.OuterXml;
}
/// <summary>
/// 改变所有子节点的状态
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
public void SetChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
SetChildNodeCheckedState(tn, state);
}
}
/// <summary>
/// 反选子节点
/// </summary>
/// <param name="currNode"></param>
public void SetChildNodeInvertChecked(TreeNode currNode)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked =!tn.Checked;
SetChildNodeInvertChecked(tn);
}
}
private void SetKeyCheckedState(TreeNode currNode, bool state, string keys)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
if (keys.IndexOf(FormatKeysInfo(GetNodeItem(tn).Keys)) >= 0)
{
tn.Checked = state;
}
SetKeyCheckedState(tn, state, keys);
}
}
/// <summary>
/// 根据关键词来选中列表
/// </summary>
/// <param name="sKey"></param>
public void CheckedTreeByKey(string sKey)
{
for (int i = 0; i < Nodes.Count; i++)
{
SetKeyCheckedState(Nodes[i], true, sKey);
}
}
/// <summary>
/// 根据关键词来选中列表
/// </summary>
/// <param name="sKey"></param>
public void SelectedTreeByKey(string sKey)
{
for (int i = 0; i < Nodes.Count; i++)
{
SetKeySelected(Nodes[i], true, sKey);
}
}
private void SetKeySelected(TreeNode currNode, bool state, string keys)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
if (keys==FormatKeysInfo(GetNodeItem(tn).Keys))
{
this.SelectedNode = tn;
break;
}
SetKeySelected(tn, state, keys);
}
}
/// <summary>
/// 格式化关键字(会去除重复项),以便存入数据库
/// </summary>
/// <param name="KeyItems"></param>
/// <returns></returns>
public string FormatKeysInfo(string KeyItems)
{
string tmpKeyItems = GetNoSame(KeyItems);
tmpKeyItems = tmpKeyItems.Replace(";;", ";");
tmpKeyItems = tmpKeyItems.Replace("", ";");
if (tmpKeyItems == ";" || tmpKeyItems.Length < 1)
{
tmpKeyItems = "";
return tmpKeyItems;
}
tmpKeyItems = ";" + tmpKeyItems.Trim(';') + ";";
return tmpKeyItems;
}
/// <summary>
/// 去除掉重复项
/// </summary>
/// <param name="sList"></param>
/// <returns></returns>
public string GetNoSame(string sList)
{
string[] item = sList.Split(";".ToCharArray());
string tmpStr = "";
for (int i = 0; i < item.Length; i++)
{
if (item[i] != "" && (";" + tmpStr + ";").IndexOf(item[i]) < 0)
{
tmpStr += ";" + item[i];
}
}
return tmpStr;
}
/// <summary>
/// 获取当前选中项以及所有父项的关键词组合
/// </summary>
/// <returns></returns>
public string GetKey()
{
if (SelectedNode == null) { return ""; }
if (SelectedNode.Parent != null)
{
TreeNode item = SelectedNode;
string sKeys = "";
while (item.Parent != null)
{
sKeys += ";" + GetNodeItem(item).Keys;
item = item.Parent;
}
return FormatKeysInfo(GetNoSame(sKeys));
}
return "";
}
/// <summary>
/// 获取选中的
/// </summary>
/// <param name="key_text"></param>
/// <param name="e"></param>
/// <returns></returns>
public string GetCheckedKey(string key_text,TreeViewEventArgs e)
{
if (e.Node.Checked)
{
string sKeys = key_text + ";" + GetNodeItem(e.Node).Keys;
return FormatKeysInfo(sKeys);
}
else
{
string sKeys = ";" + key_text + ";";
sKeys = FormatKeysInfo(sKeys);
string myKey = GetNodeItem(e.Node).Keys;
if (myKey != "")
{
sKeys = sKeys.Replace(myKey, "");
}
return FormatKeysInfo(sKeys);
}
}
private void ContextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
if (!m_ShowMenu) { e.Cancel = true; }
if (this.SelectedNode == null) { return; }
menuAddGroup.Enabled=this.SelectedNode.Name != "nokeys";
if (this.SelectedNode.Parent == null)
{
menuDelGroup.Enabled = false;
menuEditGroup.Enabled = false;
menuGoNextGroup.Enabled = false;
menuGoPreGroup.Enabled = false;
}
else
{
menuDelGroup.Enabled = true;
menuEditGroup.Enabled = true;
menuGoNextGroup.Enabled = true;
menuGoPreGroup.Enabled = true;
}
}
}
}