treeview里如何用拖放来更换node的位置?

xiaohefeng 2003-07-16 03:33:37
thanks.
...全文
30 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wd_318 2003-11-02
  • 打赏
  • 举报
回复
好东西,收藏!
xiaohefeng 2003-07-17
  • 打赏
  • 举报
回复
dragdrop.cs的代码如下:

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
//导入程序中使用的命名空间
public class Form1 : Form
{
private TreeView treeView1 ;
private Point Position = new Point( 0 , 0) ;
// bool lv1_mdown = false ;
private ListView listView1 ;
private System.ComponentModel.Container components = null ;
public Form1 ( )
{
InitializeComponent ( ) ;
//初始化窗体中的各个组件
}
//清除程序中使用到的各种资源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing ) ;
}
private void InitializeComponent ( )
{
ListViewItem listViewItem1 = new ListViewItem ( "Item01" ) ;
ListViewItem listViewItem2 = new ListViewItem ( "Item02" ) ;
treeView1 = new TreeView ( ) ;
listView1 = new ListView ( ) ;
SuspendLayout ( ) ;
//此属性必须设定为"真",这样才能进行拖放操作
treeView1.AllowDrop = true ;
treeView1.ImageIndex = -1 ;
treeView1.Location = new Point ( 48 , 40 ) ;
treeView1.Name = "treeView1" ;
//在TreeView组件中加入初始化的节点
treeView1.Nodes.Add ( new TreeNode ( "节点01" ) );
treeView1.Nodes.Add ( new TreeNode ( "节点02" ) );
treeView1.SelectedImageIndex = -1 ;
treeView1.Size = new Size ( 121 , 144 ) ;
treeView1.TabIndex = 0 ;
treeView1.DragEnter += new DragEventHandler ( treeView1_DragEnter ) ;
treeView1.ItemDrag += new ItemDragEventHandler ( treeView1_ItemDrag ) ;
treeView1.DragDrop += new DragEventHandler ( treeView1_DragDrop ) ;
//此属性必须设定为"真",这样才能进行拖放操作
listView1.AllowDrop = true ;
//在ListView组件中加入项目
listView1.Items.Add ( listViewItem1 ) ;
listView1.Items.Add ( listViewItem2 ) ;
listView1.Location = new Point ( 208 , 40 ) ;
listView1.Name = "listView1" ;
listView1.Size = new Size ( 121 , 144 ) ;
listView1.TabIndex = 2 ;
listView1.View = View.List ;
listView1.DragDrop += new DragEventHandler ( listView1_DragDrop ) ;
listView1.DragEnter += new DragEventHandler ( listView1_DragEnter ) ;
listView1.ItemDrag += new ItemDragEventHandler ( listView1_ItemDrag ) ;

AutoScaleBaseSize = new Size ( 6 , 14 ) ;
ClientSize = new Size ( 376 , 237 ) ;
Controls.Add ( listView1 );
Controls.Add ( treeView1 );
this.MaximizeBox = false ;
this.MinimizeBox = false ;
this.Name = "Form1" ;
this.Text = "全面掌握C#中的拖放操作" ;
this.ResumeLayout ( false ) ;
}
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void treeView1_ItemDrag ( object sender , ItemDragEventArgs e )
{
string strItem = e.Item.ToString ( ) ;
//开始进行"Drag"操作
DoDragDrop ( strItem , DragDropEffects.Copy | DragDropEffects.Move ) ;
}
private void listView1_DragEnter ( object sender , DragEventArgs e )
{
//判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
if ( e.Data.GetDataPresent ( DataFormats.Text ) )
e.Effect = DragDropEffects.Move ;
else
e.Effect = DragDropEffects.None ;
}
private void listView1_DragDrop ( object sender , DragEventArgs e )
{
string dummy = "temp" ;
//获得进行"Drag"操作中拖动的字符串
string s = ( string ) e.Data.GetData ( dummy.GetType ( ) ) ;
s = s.Substring ( s.IndexOf ( ":" ) + 1 ).Trim ( ) ;
Position.X = e.X ;
Position.Y = e.Y ;
Position = listView1.PointToClient ( Position ) ;
//在目标组件中加入以此字符串为标题的项目
listView1.Items.Add ( new ListViewItem ( s , 0 ) ) ;
}

private void listView1_ItemDrag ( object sender , ItemDragEventArgs e )
{
//判断是否是鼠标右键按动
if ( e.Button == MouseButtons.Right ) return ;
int nTotalSelected = listView1.SelectedIndices.Count ;
//判断组件中是否存在项目
if ( nTotalSelected <= 0 ) return ;
IEnumerator selCol = listView1.SelectedItems.GetEnumerator ( ) ;
selCol.MoveNext ( ) ;
ListViewItem lvi = ( ListViewItem )selCol.Current ;
string mDir = "" ;
for ( int i = 0 ; i < lvi.SubItems.Count ; i++ )
mDir += lvi.SubItems[ i ].Text + " ," ;
string str = mDir.Substring ( 0 , mDir.Length-1 ) ;
if ( str == "" ) return ;
//对组件中的字符串开始拖放操作
listView1.DoDragDrop ( str , DragDropEffects.Copy | DragDropEffects.Move ) ;
}
private void treeView1_DragEnter ( object sender , DragEventArgs e )
{
//判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
if ( e.Data.GetDataPresent ( DataFormats.Text ) )
e.Effect = DragDropEffects.Copy ;
else
e.Effect = DragDropEffects.None ;
}
private void treeView1_DragDrop ( object sender , DragEventArgs e )
{
//获得进行"Drag"操作中拖动的字符串
string dummy = "temp" ;
string s = ( string ) e.Data.GetData ( dummy.GetType ( ) ) ;
s = s.Substring ( s.IndexOf ( ":" ) + 1 ).Trim ( ) ;
Position.X = e.X ;
Position.Y = e.Y ;
Position = treeView1.PointToClient ( Position ) ;
TreeNode DropNode = this.treeView1.GetNodeAt ( Position ) ;
//在目标组件中加入以此字符串为标题的项目
if ( DropNode != null )
{
TreeNode DragNode = new TreeNode ( s ) ;
treeView1.Nodes.Insert ( DropNode.Index+1 , DragNode ) ;
}
}
}
xiaohefeng 2003-07-17
  • 打赏
  • 举报
回复
1.设置AllowDrop=true;

2.在ItemDrag事件中,执行DoDragDrop();如:
if(e.Button==MouseButtons.Left)
(sender as Control).DoDragDrop(e.Item, DragDropEffect.All);

3.响应DragEnter或者DragOver事件;如:
在DragOver事件中:
if(e.Effect!=DragDropEffects.None)
e.Effect = (e.KeyState & 8)==8 ? DragDropEffects.Copy :
DragDropEffects.Move;
TreeView tv = sender as TreeView;
TreeNode node = tv.GetNodeAt(tv.PointToClient(new Point(e.X, e.Y)));
if(node != null)
tv.SelectNode = node;

4.在DragDrop事件中:
TreeNode node = (TreeNode)e.Data.GetData(typeof(TreeNode));
if(e.Effect == DragDropEffects.Move)
node.Remove();
else
node = (TreeNode)node.Clone();
TreeView tv = sender as TreeView;
if(tv.SelectNode != null)
tv.SelectNode.Nodes.Add(node);
else
tv.SelectedNode = node;

如果你想用现成的控件的话可以用我已写好的,在这里:

http://www.diyinside.com/kefroth/wincontrols.zip

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧