随着桌面系统的推出,利用鼠标的拖放(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 ) ;
}
}
全面掌握C#中的拖放操作
最新推荐文章于 2022-12-12 09:48:32 发布