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
}
}