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