private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Link;
else e.Effect = DragDropEffects.None;
}
private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
//其中 label1.Text顯示的就是拖進(jìn)文件的文件名;
label1.Text = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
}
注:窗體的 AllowDrop=True;
-----------------------------
必須處理好三種事件:"ItemDrag"、"DragEnter"、"DragDrop"。其中只有第一種事件是在源組件中觸發(fā)的,另外二種事件是在目標(biāo)組
件中觸發(fā)的。其中當(dāng)用戶拖動(dòng)組件觸發(fā)"ItemDrag"事件;當(dāng)拖動(dòng)數(shù)據(jù)進(jìn)入目標(biāo)組件區(qū)域觸發(fā)"DragEnter"事件;當(dāng)用戶在目標(biāo)組件區(qū)域
放置拖動(dòng)的數(shù)據(jù)觸發(fā)"DragDrop"事件。下面就根據(jù)拖放操作的操作順序來詳細(xì)介紹:
(1).開始"拖"(Drag)操作:
通過"DoDragDrop"方法拉開了拖放操作的第一步。"DoDragDrop"方法的語法為: DoDragDrop ( object data , DragDropEffects
allowedEffects ) ;
其中第二個(gè)參數(shù)來是說明此次拖放操作最后所要實(shí)現(xiàn)的效果,因?yàn)橥戏挪僮饔袝r(shí)實(shí)現(xiàn)的效果是把源組件中的內(nèi)容"拖"到目標(biāo)組件中,
這種效果就是 "Move";有時(shí)拖放的效果是在目標(biāo)組件中加入拖動(dòng)的數(shù)據(jù),對(duì)源組件的內(nèi)容是沒有什么影響的,這種效果就是"Copy"。
當(dāng)然無論是"Move"還是 "Copy",這都要通過具體的編程來實(shí)現(xiàn),設(shè)定這些效果只是告訴操作系統(tǒng),你進(jìn)行拖放操作的類型,從而為拖
放操作設(shè)定特定的圖標(biāo)。此例中實(shí)現(xiàn)開始"拖放 "操作的具體實(shí)現(xiàn)代碼如下:
private void treeView1_ItemDrag ( object sender , ItemDragEventArgs e )
{
string strItem = e.Item.ToString ( ) ;
//開始進(jìn)行"Drag"操作
DoDragDrop ( strItem , DragDropEffects.Copy | DragDropEffects.Move ) ;
}
在上面代碼中,我們定義的拖放數(shù)據(jù)類型是字符串,其實(shí)拖放的數(shù)據(jù)類型可以是很多種的,你可以通過修改"DoDragDrop"方法的第一
個(gè)參數(shù)來設(shè)定你所要拖放數(shù)據(jù)類型,譬如:位圖或者其他什么。
(2).目標(biāo)組件允許進(jìn)行拖放操作:
既然你已經(jīng)開始進(jìn)行拖放操作,你還必須告訴你要拖放到的目標(biāo)組件,要接受你所拖放的數(shù)據(jù),"DragEnter"事件正好可以處理。在下
列的代碼中,我們是通過判斷拖放數(shù)據(jù)類型來確定是否接受拖放,如果是字符串,則可以,否則,則不行。具體代碼如下:
private void listView1_DragEnter ( object sender , DragEventArgs e )
{
//判斷是否目前拖動(dòng)的數(shù)據(jù)是字符串,如果是,則拖動(dòng)符串對(duì)目的組件進(jìn)行拷貝
if ( e.Data.GetDataPresent ( DataFormats.Text ) )
e.Effect = DragDropEffects.Move ;
else
e.Effect = DragDropEffects.None ;
}
(3).獲得拖放的字符串,在目標(biāo)組件中加入相應(yīng)的內(nèi)容:
此步的處理過程是十分明確的,要分成二步來進(jìn)行,首先要得到拖放的字符串,其次是在目標(biāo)組件中加入以此字符串為標(biāo)題的項(xiàng)目。
當(dāng)然還要在相應(yīng)的位置了。下面就是實(shí)現(xiàn)這二步操作的具體代碼:
private void listView1_DragDrop ( object sender , DragEventArgs e )
{
string dummy = "temp" ;
//獲得進(jìn)行"Drag"操作中拖動(dòng)的字符串
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 ) ;
//在目標(biāo)組件中加入以此字符串為標(biāo)題的項(xiàng)目
listView1.Items.Add ( new ListViewItem ( s , 0 ) ) ;
}
此致通過對(duì)這三個(gè)事件的編程,已經(jīng)完成了由 TreeView組件到ListView 組件的拖放操作。