TreeView 使用

using System;
using System.Windows;
using System.Windows .Forms ;
using System.Data ;
using System.Drawing;

namespace MyProject
{
 /// <summary>
 /// FillTreeView 的摘要说明。
 /// </summary>
 public class TreeViewControl
 {
  #region  填充树控件  Fill(treeView1)
  /// <summary>
  /// 填充树控件|tableName 中有 pid、id、Name
  /// </summary>
  public static void  Fill(System.Windows .Forms .TreeView treeView ,string tableName,int rootID)
  {
   string   sqlSelect   =   "SELECT   ID,PID,Name   FROM  "+tableName+"  where   PID   ="+rootID+"";
   DataSet   dt=new DataSet ();
   dt=OleDbDataControl.GetDataSet(sqlSelect,tableName);
   for(int   i=0;i<dt.Tables [tableName].Rows.Count;i++)                        
   {  
    TreeNode   newNode=new   TreeNode();
    newNode.Text =dt.Tables [tableName].Rows[i][2].ToString();
    newNode.Tag  =dt.Tables [tableName].Rows[i][0].ToString();
    treeView.Nodes.Add(ShowAllTree(int.Parse (newNode.Tag.ToString ()),newNode,tableName));
   }  
   dt.Dispose(); 
  }

  /// <summary>
  /// 填充遍历树|tableName 中有 pid、id
  /// </summary>
  private static  TreeNode   ShowAllTree(int   id,TreeNode   node,string tableName)  
  {  
   string   sqlSelect   =   "SELECT   ID,PID,Name   FROM "+tableName+"  where   PID   ="+id+"";
   DataSet   dt=new DataSet ();
   dt=OleDbDataControl.GetDataSet(sqlSelect,tableName);
   for(int   i=0;i<dt.Tables [tableName].Rows.Count;i++)                        
   {  
    TreeNode   newNode=new   TreeNode();
    newNode.Text =dt.Tables [tableName].Rows[i][2].ToString();
    newNode.Tag  =dt.Tables [tableName].Rows[i][0].ToString();
    node.Nodes.Add(newNode);  
    int   newID   =   (int)dt.Tables [tableName].Rows[i][0];;  
    ShowAllTree(newID,newNode,tableName);   //递归调用,将子结点ID当做下一当前结点ID  
   }  
   dt.Dispose();  
   return   node;  
  }  
  #endregion

  #region  删除所选节点以及子节点
  /// <summary>
  /// 删除所选节点以及子节点
  /// </summary>
  public static void DelTreeNodes( TreeView treeView,string tableName)
  {
   DeleteNode(int.Parse (treeView .SelectedNode .Tag.ToString ()),tableName);
   treeView.SelectedNode.Remove();
  }

  /// <summary>
  ///  遍历删除所选节点以及子节点|tableName 中有 pid、id
  /// </summary>
  private static void DeleteNode(int nodeId ,string talbeName)
  {
   string selectId="select ID from "+talbeName+" where PID="+nodeId+"";
   DataSet   dt=new DataSet ();
   try
   {
    dt=OleDbDataControl.GetDataSet(selectId,talbeName);
    for(int   i=0;i<dt.Tables [talbeName].Rows.Count;i++)                        
    {  
     DeleteNode( int.Parse (dt.Tables [talbeName].Rows[i][0].ToString()),talbeName );
    }  
    dt.Dispose();
    string delSql = "delete from "+talbeName+" where ID="+nodeId+"";
    OleDbDataControl.uid ( delSql );
   }
   catch (Exception ex)
   {
    dt.Dispose(); 
    throw new Exception(ex.ToString());
   }
  }
  #endregion

  #region   添加后 刷新树节点(非根节点)
  /// <summary>
  /// 添加后 刷新树节点
  /// (刷新所选节点)|tableName 中有 pid、id
  /// </summary>
  public static void UpdateTreeNodes( TreeView treeView ,string tableName)
  {
   string   sqlSelect   =   "SELECT   ID,PID,Name   FROM  "+tableName+"  where   PID   ="+int.Parse (treeView .SelectedNode .Tag .ToString ())+"";
   DataSet   dt=new DataSet ();
   dt=OleDbDataControl.GetDataSet(sqlSelect,tableName);
   treeView .SelectedNode .Nodes.Clear ();
   for(int   i=0;i<dt.Tables [tableName].Rows.Count;i++)
   {
    TreeNode   newNode=new   TreeNode();
    newNode.Text =dt.Tables [tableName].Rows[i][2].ToString();
    newNode.Tag  =dt.Tables [tableName].Rows[i][0].ToString();
    treeView .SelectedNode .Nodes.Add(ShowAllTree(int.Parse (newNode.Tag.ToString ()),newNode,tableName));
   }
   dt.Dispose();
  }
  #endregion

  #region 移动节点
  private static bool ContainsNode(TreeNode node1, TreeNode node2)
  {
   if (node2.Parent == null) return false;
   if (node2.Parent.Equals(node1)) return true;
   return ContainsNode(node1, node2.Parent);
  }

  /// <summary>
  /// tableName 表名|tableName 中有 pid、id
  /// </summary>
  public static void DragDrop(  TreeView treeView , System.Windows.Forms.DragEventArgs e , string tableName )
  {
   Point targetPoint = treeView.PointToClient(new Point(e.X, e.Y));
   TreeNode targetNode = treeView.GetNodeAt(targetPoint);
   string checkSql = "select IsChild from  "+ tableName +"  where ID="+int.Parse ( targetNode .Tag.ToString ())+"";
   string isChild = OleDbDataControl.GetOneDate ( checkSql );
   if ( isChild == "0")
   {
    MessageBox.Show ("不能移动到指定节点!");
    return ;
   }
   else
   {
    TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
    if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
    {
     if (e.Effect == DragDropEffects.Move)
     {
      draggedNode.Remove();
      targetNode.Nodes.Add(draggedNode);
     }
     else if (e.Effect == DragDropEffects.Copy)
     {
      targetNode.Nodes.Add((TreeNode)draggedNode.Clone());
     }
     targetNode.Expand();
    }
    string sql="UPDATE "+ tableName +" SET pid ="+int.Parse ( targetNode .Tag.ToString ())+" where id="+int.Parse ( draggedNode .Tag.ToString ())+"";
    OleDbDataControl.uid (sql);
    MessageBox.Show ("移动成功!","提示");
   }
  }

  public static void DragEnter( System.Windows.Forms.DragEventArgs e )
  {
   e.Effect = e.AllowedEffect;
  }

  public static void DragOver( TreeView treeView , System.Windows.Forms.DragEventArgs e )
  {
   Point targetPoint = treeView.PointToClient(new Point(e.X, e.Y));
   treeView.SelectedNode = treeView.GetNodeAt(targetPoint);
  }
  #endregion

  #region 是否能添加子节点 true:能
  /// <summary>
  /// 是否能添加子节点 true:能
  /// </summary>
  public static bool IsAbleChild( TreeView treeView,string tableName )
  {
   string insertSql = "select IsChild from "+ tableName +" where ID="+int.Parse ( treeView .SelectedNode .Tag.ToString ())+"";
   string isChild = OleDbDataControl.GetOneDate ( insertSql );
   if ( isChild == "0")
   {
    return false;
   }
   else
   {
    return true;
   }
  }
  #endregion
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值