您的位置:首页 > 数据库

重写的树控件

2004-11-20 21:30 459 查看
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.Conver
4000
t .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);

   }
   
  }

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息