逐步解說:在 Windows Form 中執行拖放作業
若要在 Windows 應用程式中執行拖放作業,您必須處理一系列事件,尤其是 DragEnter、DragLeave 及 DragDrop 事件。 使用這些事件的事件引數中所提供的資訊,即可輕鬆地運用拖放作業。
拖曳資料
所有拖放作業都是從拖曳開始。 在拖曳開始時收集資料的功能是在 DoDragDrop 方法中進行實作。
在下列範例中,使用 MouseDown 事件來啟動拖曳作業,因為它是最直覺式 (按下滑鼠按鈕時會開始大部分的拖放動作)。 不過,請記住,可以使用任何事件來啟始拖放程序。
啟動拖曳作業
在將開始拖曳的控制項的 MouseDown 事件中,使用
DoDragDrop
方法來設定要拖曳資料,以及允許的拖曳效果。 如需詳細資訊,請參閱 Data 和 AllowedEffect。下列範例示範如何啟始拖曳作業。 拖曳開始的控制項是 Button 控制項,正在拖曳的資料是代表 Button 控制項 Text 屬性的字串,而允許的效果會複製或移動。
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move) End Sub
private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { button1.DoDragDrop(button1.Text, DragDropEffects.Copy | DragDropEffects.Move); }
拖曳作業生效時,您可以處理 QueryContinueDrag 事件,而此事件會向系統要求繼續拖曳作業的權限。 處理此方法時,您也可以呼叫會影響拖曳作業的方法,例如,當游標停留在 TreeView 控制項上時展開 TreeNode。
卸除資料
當您開始將資料從某個位置拖曳至 Windows Forms 或控制項時,當然會想要將它卸除到某個位置。 游標在通過已正確設定可卸除資料的表單或控制項的某個區域時會變更。 Windows Form 或控制項內的任何區域都可以藉由設定 AllowDrop 屬性及處理 DragEnter 和 DragDrop 事件,來接受已卸除的資料。
執行卸除
將 AllowDrop 屬性設定為 true。
在將進行卸除的控制項的
DragEnter
事件中,確定所拖曳的資料具有可接受的類型 (在此情況下為 Text)。 程式碼接著會設定卸除 DragDropEffects 列舉中的值時所發生的效果。 如需詳細資訊,請參閱Effect。Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub
private void textBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; }
注意
您可以將自己的物件指定為 SetData 方法的 Object 參數,以定義自己的 DataFormats。 這麼做時,請確定可序列化所指定的物件。 如需詳細資訊,請參閱ISerializable。
在發生卸除之控制項的 DragDrop 事件中,使用 GetData 方法來擷取要拖曳的資料。 如需詳細資訊,請參閱Data。
在下列範例中,TextBox 控制項就是要拖曳到的控制項 (在其中將進行卸除)。 程式碼會將 Text 控制項的 TextBox 屬性設為等於正在拖曳的資料。
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString End Sub
private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { textBox1.Text = e.Data.GetData(DataFormats.Text).ToString(); }
注意
此外,您可以使用 KeyState 屬性,因此,根據拖放作業期間所按下的按鍵,會發生特定效果 (例如,在按下 CTRL 鍵時複製所拖曳資料是標準做法)。