///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请注明出处,并包含本声明
///作者: CSDN网名alias88,邮件: _[email protected] ,QQ:63343
_
__
using
System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
namespace upLibrary.upControls
{
///
1<summary>
2
3/// 实现了拖放操作处理,并且每一个结点的添加和移除都能引发事件的TreeView。
4
5/// </summary>
public class upTreeViewBase : System.Windows.Forms.TreeView
{
private System.ComponentModel.Container components = null ;
private TreeNode _DragNode;
private bool _MoveNode= false ;
private bool _CopyNode= false ;
private bool _CanDropDrag= false ;
///
1<summary>
2
3/// 删除节点事件句柄(sender 是父结点或为空,e.Node是子结点)
4
5/// </summary>
public delegate void NodeDeleteHandler ( object Sender,upLibrary.upControls.TreeNodeEventArgs e);
///
1<summary>
2
3/// 增加节点事件句柄(sender 是父结点或为空,e.Node是子结点)
4
5/// </summary>
public delegate void NodeAddHandler ( object Sender,upLibrary.upControls.TreeNodeEventArgs e);
///
1<summary>
2
3/// 在删除或增加节点之间浏览子节点事件句柄(sender 是父结点或为空,e.Node是子结点)
4
5/// </summary>
public delegate void BrowseTreeNodesEventHandler ( object Sender,TreeNodeEventArgs e);
///
1<summary>
2
3/// 在拖放操作中改变父结点事件句柄(sender 是父结点或为空,e.Node是子结点)
4
5/// </summary>
public delegate void ParentChangByDrapDropHandler ( object Sender,TreeNodeEventArgs e);
[Description("在拖放操作中改变结点的父之前发生此事件") ]
public event ParentChangByDrapDropHandler ParentChangingByDrapDrop;
[Description("在拖放操作中改变了结点的父之后发生此事件") ]
public event ParentChangByDrapDropHandler ParentChangedByDrapDrop;
[Description("sender所代表的节点将被移除,通常在移动拖放操作之前后发生,或树已加载后再移除之前发生") ]
public event NodeDeleteHandler NodeDeleting;
[Description("sender所代表的节点将被添加,通常在移动或复制拖放操作完成后发生,或树已加载后再新增之前发生") ]
public event NodeAddHandler NodeAdding;
[Description("sender所代表的节点被移除,通常在移动拖放操作完成后发生,或树已加载后再移除节点后发生") ]
public event NodeDeleteHandler NodeDeleted;
[Description("sender所代表的节点被添加,通常在移动或复制拖放操作完成后发生,或树已加载后再新增节点后发生") ]
public event NodeAddHandler NodeAdded;
[Description("当调用BrowseNodes时从最低层开始遍历到指定node时发生此事件") ]
public event BrowseTreeNodesEventHandler InverseBrowseTreeNodes;
[Description("向下遍历到指定node时发生此事件") ]
public event BrowseTreeNodesEventHandler DownBrowseTreeNodes;
public upTreeViewBase()
{
InitializeComponent();
}
///
1<summary>
2
3/// 清理所有正在使用的资源。
4
5/// </summary>
protected override void Dispose( bool disposing )
{
if ( disposing )
{
if (components != null )
{
components.Dispose();
}
}
base .Dispose( disposing );
}
#region 组件设计器生成的代码
///
1<summary>
2
3/// 设计器支持所需的方法 - 不要使用代码编辑器修改
4
5/// 此方法的内容。
6
7/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
#region "拖放相关"
///
1<summary>
2
3/// 是否移动型拖放
4
5/// </summary>
public bool CanMoveNode
{
get { return _MoveNode;}
set
{
this .ItemDrag -= new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this .DragEnter -= new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this .DragDrop -= new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);
_MoveNode= value ;
if (_MoveNode)
{
this .ItemDrag += new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this .DragEnter += new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this .DragDrop += new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);
}
}
}
///
1<summary>
2
3/// 是否复制型拖放
4
5/// </summary>
public bool CanCopyNode
{
get { return _CopyNode;}
set
{
this .ItemDrag -= new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this .DragEnter -= new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this .DragDrop -= new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);
_CopyNode= value ;
if (_CopyNode)
{
this .ItemDrag += new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this .DragEnter += new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this .DragDrop += new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);
}
}
}
///
1<summary>
2
3/// 开始拖放
4
5/// </summary>
///
1<param name="sender"/>
///
1<param name="e"/>
protected void TreeView_ItemDrag( object sender, System.Windows.Forms.ItemDragEventArgs e)
{
this ._DragNode = (TreeNode)e.Item;
string strItem = e.Item.ToString();
if (_CopyNode && _MoveNode)
DoDragDrop(strItem, DragDropEffects.Move | DragDropEffects.Copy );
else if (_CopyNode)
DoDragDrop(strItem, DragDropEffects.Copy );
else if (_MoveNode)
DoDragDrop(strItem, DragDropEffects.Move );
}
///
1<summary>
2
3/// 拖入到控件边界内时
4
5/// </summary>
<SPAN style="COLOR: gray"