重写的树控件

原创 2004年11月20日 21:30:00

namespace  MyTree.Controls
{
 /// <summary>
 /// 作用:重写树控件
 ///  编写日期:2004-7-2
 /// </summary>
 ///
 public class Tree : System.Windows .Forms .TreeView
 {
  private string[] _ParentFields;
  private string[] _DisplayFields;
  private string[] _ValueFields;
  private string[] _SortOrder;
  /// <summary>
  /// 定义WebService
  /// </summary>
  public XSTBD.BDWSCall.WebSrvQuery.WebSrvQuery  webSrvQuery ;
  
  /// <summary>
  /// 定义属性 DisPlayFields:保存树节点所显示的字段名称
  /// </summary>
  public string[] DisplayFields
  {
   get
   {
    return this._DisplayFields;
   }
   set
   {
    if (this._DisplayFields != value)
     this._DisplayFields = value;
   }
  }
  /// <summary>
  /// 定义属性 ValueFields:保存树节点关联数据字段,与属性ParentFields一起确定父子节点之间的关系
  /// </summary>
  public string[] ValueFields
  {
   get
   {
    return this._ValueFields;
   }
   set
   {
    if (this._ValueFields != value)
     this._ValueFields = value;
   }
  }

  /// <summary>
  /// 定义属性 ParentFields:保存父节点关联数据子段,与属性ValueFields一起确定父子节点之间的关系
  /// </summary>
  public string[] ParentFields
  {
   get
   {
    return this._ParentFields;
   }
   set
   {
    if (this._ParentFields != value)
     this._ParentFields = value;
   }
  }
  /// <summary>
  /// 定义属性 SortOrder:树层排序字段
  /// </summary>
  public string[] SortOrder
  {
   get
   {
    return this._SortOrder ;
   }
   set
   {
    if (this._SortOrder != value)
     this._SortOrder = value;
   }
  }
  /// <summary>
  /// 定义缺省构造函数
  /// </summary>
  public Tree()
  { 

  }
  /// <summary>
  /// 添加节点
  /// </summary>
  /// <param name="PNode">父节点</param>
  /// <param name="planNodeInfo">节点信息实体</param>
  public void AddNode(TreeNode PNode,TreeNodeInfo planNodeInfo)
  {  
   TreeNode node = new TreeNode();
   node.Text  = planNodeInfo.nodeText;
   node.Tag = planNodeInfo;
   node.ImageIndex  = planNodeInfo.level;
   node.SelectedImageIndex = node.ImageIndex;
   PNode.Nodes.Add(node);
  }

  /// <summary>
  /// 添加节点
  /// </summary>
  /// <param name="PNode">父节点</param>
  /// <param name="planNodeInfo">节点信息实体</param>
  /// <param name="imageIndex">图标序号</param>
  /// <returns>返回节点索引</returns>
  public int AddNode(TreeNode PNode,TreeNodeInfo planNodeInfo,int imageIndex)
  {  
   TreeNode node = new TreeNode();
   node.Text  = planNodeInfo.nodeText;
   node.Tag = planNodeInfo;
   node.ImageIndex  = imageIndex;
   node.SelectedImageIndex = node.ImageIndex;
   return PNode.Nodes.Add(node);
  }
  /// <summary>
  /// 修改节点信息
  /// </summary>
  /// <param name="node">所修改的节点</param>
  /// <param name="planNodeInfo">节点信息实体</param>
  public void UpdateNode(TreeNode node,TreeNodeInfo planNodeInfo)
  {  
   node.Text = planNodeInfo.nodeText ;
   node.Tag = planNodeInfo;
  }
  /// <summary>
  /// 刷新节点图标
  /// </summary>
  /// <param name="node">所刷新节点</param>
  /// <param name="imageIndex">图标序号</param>
  public void RefurbishImage(TreeNode node,int imageIndex)
  {
   node.ImageIndex = imageIndex;
   node.SelectedImageIndex = node.ImageIndex ;
  }
  /// <summary>
  /// 删除节点及其所有子节点
  /// </summary>
  /// <param name="Node">删除节点名称</param>
  public void DelNode(TreeNode Node)
  {  
   if (Node ==null) return;
   Node.Remove ();
  }
  /// <summary>
  /// 显示树
  /// </summary>
  /// <param name="PNode">父节点,可以为空。如果不为空,将树作为其子树在其下显示;否则作为一棵新树显示</param>
  /// <param name="Data">从数据集获得节点显示数据</param>
  /// <param name="Height">待加载树的层数</param>
  public void DrawTree(TreeNode  PNode,DataSet Data,int Height)
  {   
   if (PNode == null)
   {
    DataView dataView = new DataView() ;
    dataView.Table = Data.Tables[0];
    string rowFilter;
    rowFilter = this._ValueFields[0] + " >1 " ;
    rowFilter = rowFilter + " and " + this._ValueFields[1] +"=0";
    dataView.RowFilter = rowFilter; 
    for (int i = 0;i < dataView.Count;i++ )
    {
     TreeNode  node = new TreeNode () ;
     node.Text  = dataView[i][this._DisplayFields[0]].ToString ();
     TreeNodeInfo nodeInfo = new TreeNodeInfo ();
     nodeInfo.nodeText = node.Text;
     nodeInfo.dataValue = System.Convert .ToInt32 (dataView[i][this._ValueFields[0]]);
     nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
     node.Tag = nodeInfo;
     node.ImageIndex = nodeInfo.level;
     node.SelectedImageIndex = node.ImageIndex;
     PNode.Nodes.Add(node);
     DrawNodes(node,Data,1,Height-1);
    }
   }
   else
   {
    DrawNodes(PNode,Data,1,Height);
    
   }
  }
  /// <summary>
  /// 显示树
  /// </summary>
  /// <param name="PNode">父节点,可以为空。如果不为空,将树作为其子树在其下显示;否则作为一棵新树显示</param>
  /// <param name="SelectStr">从查询字符串数组获得树节点显示的数据</param>
  /// <param name="Height">待加载树的层数</param>
  public void DrawTree(TreeNode  PNode,string[] SelectStr,int Height)
  {   
   if (PNode == null)
   {
    DataSet dataSet = webSrvQuery.GetQueryDataSetBySQLText(SelectStr[0]);
    foreach (DataRow dataRow in dataSet.Tables[0].Rows)
    {
     TreeNode  node = new TreeNode () ;
     node.Text  = dataRow[this._DisplayFields[0]].ToString ();
     TreeNodeInfo nodeInfo = new TreeNodeInfo ();
     nodeInfo.nodeText = node.Text;
     nodeInfo.dataValue = System.Convert .ToInt32 (dataRow[this._ValueFields[0]]);
     nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
     node.Tag = nodeInfo;
     if (((TreeNodeInfo)node.Tag).level >= 3)
      node.ImageIndex = 3 + System.Convert .ToInt32 (dataRow["DataType_NR"]);
     else
      node.ImageIndex = nodeInfo.level;
     node.SelectedImageIndex = node.ImageIndex;
     this.Nodes.Add(node);
     DrawNodes(node,SelectStr,1,Height-1);
    }
   }
   else
   {
    DrawNodes(PNode,SelectStr,1,Height);
    
   }
  }
       
  /// <summary>
  /// 显示树
  /// </summary>
  /// <param name="PNode">父节点,可以为空</param>
  /// <param name="SelectStr">查询字符串</param>
  /// <param name="Height">待加载树的层数</param>
  public void DrawTree(TreeNode  PNode,string SelectStr,int Height)
  {  
   DataSet data = webSrvQuery.GetQueryDataSetBySQLText (SelectStr);;
   DrawTree(PNode,data ,Height);
  }

  /// <summary>
  /// 显示子树节点
  /// </summary>
  /// <param name="PNode">显示子树的父节点,不能为空</param>
  /// <param name="Data">从数据集获得节点显示的数据</param>
  /// <param name="TreeHeight">当前树的高度</param>
  /// <param name="Height">待添加层数</param>
  public void DrawNodes(TreeNode PNode,DataSet Data,int TreeHeight,int Height)
  {  
   if ((Height <= 0)||(TreeHeight > this._ParentFields.Length))
   {
    return;
   }
   if (PNode.Nodes.Count > 0)    //节点已经存在
   {
    foreach (TreeNode node in PNode.Nodes)
     DrawNodes(node,Data,TreeHeight + 1,Height-1); 
   }
   else
   {
    DataView dataView = new DataView() ;
    dataView.Table = Data.Tables[0];
    string rowFilter;
    rowFilter = this._ValueFields[TreeHeight - 1] + " > 1 " ;
    if (TreeHeight <= 1)
    {
     rowFilter = rowFilter + " and " + this._ParentFields[TreeHeight - 1] +" =0 ";
    }
    if ( !((TreeNodeInfo)PNode.Tag).dataValue.Equals(0))
    {
     rowFilter = rowFilter + " and " + this._ParentFields[TreeHeight - 1] + "=" +
      ((TreeNodeInfo)PNode.Tag).dataValue.ToString() ;
    }
    dataView.RowFilter = rowFilter; 
    for (int i = 0;i < dataView.Count;i++ )
    {
     TreeNode  node = new TreeNode ();
     node.Text  = dataView[i][this._DisplayFields[TreeHeight - 1]].ToString ();
     TreeNodeInfo nodeInfo = new TreeNodeInfo ();
     nodeInfo.nodeText = node.Text;
     nodeInfo.dataValue = System.Convert.ToInt32(dataView[i][this._ValueFields[TreeHeight - 1]]);
     nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
     node.Tag = nodeInfo;
     node.ImageIndex = nodeInfo.level;
     node.SelectedImageIndex = node.ImageIndex;
     node.SelectedImageIndex = nodeInfo.level;
     PNode.Nodes.Add(node);
     DrawNodes(node,Data,TreeHeight + 1,Height-1);

    }
   }
  }
  /// <summary>
  /// 显示子树节点
  /// </summary>
  /// <param name="PNode">显示子树的父节点,不能为空</param>
  /// <param name="SelectStr">从查询字符串数组获得树节点显示数据</param>
  /// <param name="TreeHeight">当前树的高度</param>
  /// <param name="Height">待添加层数</param>
  public void DrawNodes(TreeNode  PNode,string[] SelectStr,int TreeHeight,int Height)
  {
   
   if ((Height <= 0)||(TreeHeight > this._ParentFields.Length))
   {
    return;
   }
   if (PNode.Nodes.Count >0)    //节点已经存在
   {
    foreach (TreeNode  node in PNode.Nodes)
     DrawNodes(node,SelectStr,TreeHeight + 1,Height - 1);    
   }
   else
   {
    string whereStr = "";
    if (!((TreeNodeInfo)PNode.Tag).dataValue.Equals(0))
    {
     string fieldName = this._ParentFields[TreeHeight - 1];
     if (fieldName.Length > 0)
      whereStr = whereStr + " and " + fieldName + "=" + ((TreeNodeInfo)PNode.Tag ).dataValue .ToString ();
    }
    
    DataSet dataSet = webSrvQuery.GetQueryDataSetBySQLText (SelectStr[TreeHeight - 1] + whereStr +
     " Order By " + SortOrder[TreeHeight - 1]); 
    foreach (DataRow dataRow in dataSet.Tables[0].Rows)
    { 
     TreeNode  node = new TreeNode ();
     node.Text  = dataRow[this._DisplayFields[TreeHeight - 1]].ToString ();
     TreeNodeInfo nodeInfo = new TreeNodeInfo ();
     nodeInfo.nodeText = node.Text;
     nodeInfo.dataValue = System.Convert .ToInt32 (dataRow[this._ValueFields[TreeHeight - 1]]);
     nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
     node.Tag = nodeInfo;
     if (this.Name == "planTree" && nodeInfo.level >= 3)
      node.ImageIndex = 3 + System.Convert .ToInt32 (dataRow["DataType_NR"]);
     else
      node.ImageIndex = nodeInfo.level;
     node.SelectedImageIndex = node.ImageIndex;
     PNode.Nodes.Add(node);
     DrawNodes(node,SelectStr,TreeHeight + 1,Height - 1);

    }
   }
  }
  /// <summary>
  /// 在PNode下加载树节点(根据查询字符串SelectStr获得子节点信息)
  /// </summary>
  /// <param name="PNode">父节点</param>
  /// <param name="SelectStr">查询字符串</param>
  /// <param name="DisplayStr">节点显示文本字段</param>
  /// <param name="ValueText">节点值字段</param>
  public void DrawNodes(TreeNode PNode,string SelectStr,string DisplayStr,string ValueText)
  {
   if (PNode.Nodes.Count > 0)
    return;
   DataSet dataSet = webSrvQuery.GetQueryDataSetBySQLText(SelectStr);
   foreach (DataRow dataRow in dataSet.Tables[0].Rows)
   {
    TreeNode  node = new TreeNode ();
    node.Text  = dataRow[DisplayStr].ToString ();
    TreeNodeInfo nodeInfo = new TreeNodeInfo ();
    nodeInfo.nodeText = node.Text;
    nodeInfo.dataValue = System.Convert .ToInt32 (dataRow[ValueText]);
    nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
    node.Tag = nodeInfo;
    node.ImageIndex = nodeInfo.level;
    node.SelectedImageIndex = node.ImageIndex;
    PNode.Nodes.Add(node);
   }
  }
  /// <summary>
  /// 显示子树节点
  /// </summary>
  /// <param name="PNode">显示子树的父节点,不能为空</param>
  /// <param name="SelectStr">从查询字符串获得节点显示的数据</param>
  /// <param name="TreeHeight">当前树的高度</param>
  /// <param name="Height">待添加层数</param>
  public void DrawNodes(TreeNode  PNode,string SelectStr,int TreeHeight,int Height)
  {  
   DataSet data = webSrvQuery.GetQueryDataSetBySQLText (SelectStr);
   DrawNodes(PNode,data,TreeHeight,Height);
  }
        /// <summary>
        /// 搜索节点
        /// </summary>
        /// <param name="PNode">父节点</param>
        /// <param name="SerchValue">搜索节点所在树路径各层值的数组</param>
        /// <param name="SelectStr">树各层查询字符串数组</param>
  public void SerchNode(TreeNode PNode,int[] SerchValue,string[] SelectStr)
  {  
   if (SerchValue.Length <= ((TreeNodeInfo)PNode.Tag).level + 1)
    return;
   foreach ( TreeNode node in PNode.Nodes )
   {
    if (((TreeNodeInfo)node.Tag).dataValue.Equals(SerchValue[((TreeNodeInfo)node.Tag).level]))
    {
     this.SelectedNode = node;
     SerchNode(node,SerchValue,SelectStr);
     break;
    }
       
   }
  }
        /// <summary>
        /// 搜索节点
        /// </summary>
        /// <param name="SerchValue">搜索节点所在树路径各层值的数组</param>
        /// <param name="SelectStr">树各层查询字符串数组</param>
  public void SerchNode(int[] SerchValue,string[] SelectStr)
  {  
   if (SerchValue.Length <= 0)
    return;
   foreach (TreeNode node in this.Nodes)
   {
    if (((TreeNodeInfo)node.Tag).dataValue.Equals(SerchValue[((TreeNodeInfo)node.Tag).level]))
    {  
     this.SelectedNode = node;
     SerchNode(node,SerchValue,SelectStr);
     break;
    }
   } 
  }
  /// <summary>
  /// 加载一层文本节点
  /// </summary>
  /// <param name="pNode">要加载的文本节点的父节点</param>
  /// <param name="textStr">要加载的节点集的文本的字符串组</param>
  public void DrawTextNodes(TreeNode  pNode,string[] textStr)
  {   
   if (pNode.Nodes.Count >0)    //节点已经存在
   {
    return;
   }
   int i = 0;

   foreach (string text in textStr)
   {

    TreeNode  node = new TreeNode () ;
    node.Text  = text;
    TreeNodeInfo nodeInfo = new TreeNodeInfo ();
    nodeInfo.nodeText = node.Text;
    nodeInfo.dataValue = i;
    nodeInfo.level = ((TreeNodeInfo)pNode.Tag).level + 1;
    node.Tag = nodeInfo;
    node.ImageIndex = i + 2;
    node.SelectedImageIndex = node.ImageIndex;
    pNode.Nodes.Add(node);
   
    i++;

   }

  }
  /// <summary>
  /// 加载子树节点(跨层获取关联的dataValue)
  /// </summary>
  /// <param name="PNode">加载子树的父节点,不能为空</param>
  /// <param name="SelectStr">通过查询字符串数组读数据库获得树节点显示数据</param>
  /// <param name="TreeHeight">当前树的高度</param>
  public void DrawNodesCross(TreeNode  PNode,string[] SelectStr,int TreeHeight)
  {
   if (PNode.Nodes.Count >0)    //节点已经存在
   {
    return;
   }
   string whereStr = "";
   string fieldName = this._ParentFields[TreeHeight - 1];

   //取父节点的父节点的dataValue
   whereStr = whereStr + " and " + fieldName + "=" + ((TreeNodeInfo)PNode.Parent.Tag ).dataValue .ToString ();
   
   DataSet dataSet = webSrvQuery.GetQueryDataSetBySQLText (SelectStr[TreeHeight - 1] + whereStr +
    " Order By " + SortOrder[TreeHeight - 1]); 
   foreach (DataRow dataRow in dataSet.Tables[0].Rows)
   { 
    TreeNode  node = new TreeNode ();
    node.Text  = dataRow[this._DisplayFields[TreeHeight - 1]].ToString ();
    TreeNodeInfo nodeInfo = new TreeNodeInfo ();
    nodeInfo.nodeText = node.Text;
    nodeInfo.dataValue = System.Convert .ToInt32 (dataRow[this._ValueFields[TreeHeight - 1]]);
    nodeInfo.level = ((TreeNodeInfo)PNode.Tag).level + 1;
    nodeInfo.nodeText = node.Text;
    node.Tag = nodeInfo;
    node.ImageIndex = nodeInfo.level - 1;//因为上一层的图标不与树同一系列
    node.SelectedImageIndex = node.ImageIndex;
    PNode.Nodes.Add(node);

   }
   
  }


 }

}

【MFC入门】之二 标准控件在可视化编程中的应用之编辑框控件

关键词: 成员变量的搜索,删除 编辑框控件的使用
  • u010369450
  • u010369450
  • 2016年06月26日 20:35
  • 412

Android-自定义View之重写控件(自定义Dialog)

自定义控件实现的方式主要有:重写控件,组装控件,继承View,opengL等。这里说的控件是指安卓自有的控件,TextView、Button等。 本篇先讲第一种方式:重写控件。 重写控件,也就是继...
  • WZG_1987
  • WZG_1987
  • 2013年06月11日 13:20
  • 4619

MFC制作一个可自由添加删除节点的树(CTreeCtrl)类

微软的MFC提供了强大的界面设计功能,但因为其很多函数过于繁琐,对初学者来说不好上手,而我自己在学习过程中也碰到了很多问题,查了很多文章,在此要特地感谢鸡琢米以及各位在CSDN上些小教程的各位前辈大佬...
  • zhuzexujiaxing
  • zhuzexujiaxing
  • 2017年04月23日 10:01
  • 1445

JS组件系列——Bootstrap 树行控件使用经验分享

前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项。不管怎么样,树控件都是很多项目里面不可或缺的组件之一。今天,...
  • u011370143
  • u011370143
  • 2016年10月08日 15:12
  • 1403

自定义控件(ScrollView的重写)

版权声明:欢迎转载,转载请注明出处http://blog.csdn.net/qian_xiao_lj 实现两个ScrollView的同步显示。因为Android控件中没有此种功能,因此需要重写S...
  • qian_xiao_lj
  • qian_xiao_lj
  • 2016年02月24日 10:57
  • 1811

JS组件系列——Bootstrap 树控件使用经验分享

前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项。不管怎么样,树控件都是很多项目里面不可或缺的组件之一。今天,...
  • doc_wei
  • doc_wei
  • 2016年12月21日 13:14
  • 698

CTreeCtrl 树控件使用方法总结

MFC Tree Control控件使用   1.InsertItem 添加节点 参数: 文字,图标,父节点 返回: HTREEITEM 示例: 添加一系列节点 HTREEITEM hIt...
  • qingzai_
  • qingzai_
  • 2016年07月06日 14:53
  • 4712

【VB.NET】——方法重载和方法重写的区别

前言         第一次接触到这个问题的时候还是在看C#视频的时候,当时并不是对比出现的这个问题,再一次就是同学问的我,因为在学习时就感觉这两个问题区分的挺清楚的,有什么好争议的呢,当时...
  • wangjinlong_
  • wangjinlong_
  • 2016年02月18日 17:19
  • 1661

MFC 自定义数字控件 (继承自CEdit)

MFC中控件 CEdit 对数字的支持不够理想, 使用删除, 负号和小数点等操作有限制. 不过可以通过派生 CEdit 来解决该问题. 定义枚举类型 ENUM_EDIT_EX, 指定对象表示 int,...
  • anye3000
  • anye3000
  • 2013年01月22日 14:54
  • 3647

MFC树形控件(CTreeCtrl)用法(下)

前面一节讲了树形控件Tree Control的简介、通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建、CTreeCtrl类的主要成员函数和应用实例。        树形控件的...
  • wang15061955806
  • wang15061955806
  • 2016年07月04日 13:51
  • 2328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重写的树控件
举报原因:
原因补充:

(最多只允许输入30个字)