ListView上的项我怎么样才能拖放到另外一个项上面去啊?谢谢

chenlm 2003-08-21 04:44:41
ListView上的项我怎么样才能拖放到另外一个项上面去啊?谢谢
...全文
38 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhulb 2003-08-21
  • 打赏
  • 举报
回复
在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDrop"属性值设定为"True",因为此属性是确定组件是否可以进行拖放操作的。
zhulb 2003-08-21
  • 打赏
  • 举报
回复
要完成此次的拖放操作,必须处理好三种事件:"ItemDrag"、"DragEnter"、"DragDrop"。其中只有第一种事件是在源组件中触发的,另外二种事件是在目标组件中触发的。其中当用户拖动组件触发"ItemDrag"事件;当拖动数据进入目标组件区域触发"DragEnter"事件;当用户在目标组件区域放置拖动的数据触发"DragDrop"事件。下面就根据拖放操作的操作顺序来详细介绍:

(1).开始"拖"(Drag)操作:

通过"DoDragDrop"方法拉开了拖放操作的第一步。"DoDragDrop"方法的语法为:

DoDragDrop ( object data , DragDropEffects allowedEffects ) ;

其中第二个参数来是说明此次拖放操作最后所要实现的效果,因为拖放操作有时实现的效果是把源组件中的内容"拖"到目标组件中,这种效果就是"Move";有时拖放的效果是在目标组件中加入拖动的数据,对源组件的内容是没有什么影响的,这种效果就是"Copy"。当然无论是"Move"还是"Copy",这都要通过具体的编程来实现,设定这些效果只是告诉操作系统,你进行拖放操作的类型,从而为拖放操作设定特定的图标。此例中实现开始"拖放"操作的具体实现代码如下:


private void treeView1_ItemDrag ( object sender , ItemDragEventArgs e ) { string strItem = e.Item.ToString ( ) ; //开始进行"Drag"操作DoDragDrop ( strItem , DragDropEffects.Copy | DragDropEffects.Move ) ; }
在上面代码中,我们定义的拖放数据类型是字符串,其实拖放的数据类型可以是很多种的,你可以通过修改"DoDragDrop"方法的第一个参数来设定你所要拖放数据类型,譬如:位图或者其他什么。

(2).目标组件允许进行拖放操作:

既然你已经开始进行拖放操作,你还必须告诉你要拖放到的目标组件,要接受你所拖放的数据,"DragEnter"事件正好可以处理。在下列的代码中,我们是通过判断拖放数据类型来确定是否接受拖放,如果是字符串,则可以,否则,则不行。具体代码如下:


private void listView1_DragEnter ( object sender , DragEventArgs e ) { //判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝 if ( e.Data.GetDataPresent ( DataFormats.Text ) ) e.Effect = DragDropEffects.Move ; else e.Effect = DragDropEffects.None ; }
(3).获得拖放的字符串,在目标组件中加入相应的内容:

此步的处理过程是十分明确的,要分成二步来进行,首先要得到拖放的字符串,其次是在目标组件中加入以此字符串为标题的项目。当然还要在相应的位置了。下面就是实现这二步操作的具体代码:


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


此致通过对这三个事件的编程,已经完成了由TreeView组件到ListView组件的拖放操作。

三. 由ListView组件到TreeView组件的拖放操作:

由ListView组件到TreeView组件的拖放操作和从TreeView组件到ListView组件相类似,也是通过"ItemDrag"、"DragEnter"、"DragDrop"三个事件来处理的,具体如下:

(1).开始"拖"(Drag)操作:

这和前者没有什么实质上的区别,只是在此次的拖放操作开始之前,多加入了一些逻辑判断,让程序更稳健的允许,实现的代码如下:


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


(2).目标组件允许进行拖放操作:

这一步是进行拖放操作最为一致的,除非你所要进行拖放的数据类型有改变,否则,没有必要对源代码进行什么修改,具体如下:


private void treeView1_DragEnter ( object sender , DragEventArgs e ) { //判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝 if ( e.Data.GetDataPresent ( DataFormats.Text ) ) e.Effect = DragDropEffects.Copy ; else e.Effect = DragDropEffects.None ; }
(3).获得拖放的字符串,在目标组件中加入相应的内容:

对于进行拖放操作的不同组件,获得其拖放的数据的实现方法是不一样的,在本步骤中也不例外,但总归大同小异,掌握程序设计的步骤和要点,加上探索、研究的精神,这个问题应该能够解决,下面是实现此步骤的程序代码:


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

110,533

社区成员

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

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

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