全面掌握C#中的拖放操作

全面掌握C#中的拖放操作

随着桌面系统的推出,利用鼠标的拖放(Drag   and   Drop)操作由于其简单、直接,受到了越来越多的读者的欢迎,为迎合这种趋势,越来越多程序员在自己的程序中使用了拖放操作。拖放操作方便了程序的使用者,但由于拖放操作在程序中的设计工作比较还有点麻烦,甚至是一个难点,许多程序员对其都有点心有余悸。本文就结合微软公司最新的.Net程序开发语言--C#,来全面介绍一下在C#中是如何处理拖放操作的。   

在本文中,我们是通过二个代表组件,也是在拖放操作中经常使用到的二个组件--TreeView组件和ListView组件,之间互相进行拖放操作来说明此类问题的。在进行拖放操作之前,必须要对进行拖放操作的组件的 "AllowDrop "属性值设定为 "True ",因为此属性是确定组件是否可以进行拖放操作的。   

一.   本文中介绍的程序的设计和运行的软件环境:   

(1).微软公司视窗2000服务器版   

(2)..Net   FrameWork   SDK   Beta   2   

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

要完成此次的拖放操作,必须处理好三种事件: "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     )     ; 
    } 
    }     


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值