RaUI/Source/ryControls/TreeXML/ctlTreeView.cs

906 lines
33 KiB
C#
Raw Normal View History

2020-11-28 07:03:28 +00:00
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;
}
}
}
}