服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - ASP.NET教程 - asp.net DoDragDrop 方法的使用

asp.net DoDragDrop 方法的使用

2019-09-25 10:37asp.net教程网 ASP.NET教程

DoDragDrop方法,用于开始对象的拖放操作,需要的朋友可以参考下。

在类库中的定义为: 

复制代码代码如下:


[UIPermissionAttribute(SecurityAction.Demand, Clipboard = UIPermissionClipboard.OwnClipboard)] 
public DragDropEffects DoDragDrop( 
Object data, 
DragDropEffects allowedEffects 


其中data参数为要拖放的数据,如果拖动操作需要于另一个进程的应用程序相互操作,data代表的数据应该是基本托管类(String,BitMap,或MetaFile),或者是实现 ISerializable 或IDataObject的对象。 allowedEffects参数表示拖放的效果,为一个枚举值(DragDropEffects).返回值也为DragDropEffects枚举值。 
  当开始调用DoDragDrop方法拖动一个数据对象时,DoDragDrops在拖放过程中,检测当前光标位置下的控件是不是有效的放置目标。如果当前光标下的控件是有效的放置目标,则GiveFeedBack事件以指定的拖放效果引发。在检测当前位置光标是否为有效的拖放目标时,DoDragDrops方法同时跟踪光标位置,键盘状态和鼠标状态的更改。 
   (1)如果用于移出了一个窗口,则引发DragLeave事件。 
  (2)如果移入了另外一个控件,则引发该控件的DragEnter事件。 
  (3)如果鼠标移动,但是停留在一个控件中,则引发DragOver事件。 
如果检测到更改了键盘或者鼠标状态,则引发拖放源的QueryContinueDrag事件, 并根据事件的QueryContinueDragEventArgs的Action属性值确定继续拖动,放置数据或取消操作。 
(1)如果Action属性指定为Continue,则将引发DragOver事件。 
(2)如果Action属性指定为Drop,则将放置效果返回给源,以便应用程序对数据进行适当的操作;例如,如果是移动操作,则剪切数据。 
(3)如果是DragAction的值为Cancel,则引发DragLeave事件 
从csdn上摘抄一段示例代码: 
  下面的代码示例演示在两个 ListBox 控件之间的拖放操作。当拖动动作启动时,该示例调用 DoDragDrop 方法。在 MouseDown 事件期间,如果从鼠标位置起鼠标移动的距离大于 SystemInformation..::.DragSize,则启动拖动动作。IndexFromPoint 方法用于确定在 MouseDown 事件期间要拖动的项的索引。 
  该示例还演示如何对拖放操作使用自定义光标。该示例要求应用程序目录中存在两个光标文件:3dwarro.cur 和 3dwno.cur,分别用于自定义拖动光标和禁止停放光标。如果选中 UseCustomCursorsCheckCheckBox,则使用自定义光标。自定义光标在 GiveFeedback 事件处理程序中设置。 
  键盘状态在右 ListBox 的 DragOver 事件处理程序中计算,以确定基于 Shift、Ctrl、Alt 或 Ctrl+Alt 键的状态将发生哪种拖动操作。放置动作在 ListBox 中发生的位置也在 DragOver 事件期间确定。如果要放置的数据不是 String,则 DragDropEffects 中将把 DragEventArgs.sEffect 设置为 None。最后,停放状态在 DropLocationLabelLabel 中显示。 
  要放置的用于右 ListBox 的数据在 DragDrop 事件处理程序中确定,并且在 ListBox 中的适当位置添加该 String 值。如果拖动操作移动到窗体边框的外面,则 QueryContinueDrag 事件处理程序中将取消拖放操作 

复制代码代码如下:


using System; 
using System.Drawing; 
using System.Windows.Forms; 
namespace Snip_DragNDrop 

public class Form1 : System.Windows.Forms.Form 

private System.Windows.Forms.ListBox ListDragSource; 
private System.Windows.Forms.ListBox ListDragTarget; 
private System.Windows.Forms.CheckBox UseCustomCursorsCheck; 
private System.Windows.Forms.Label DropLocationLabel; 
private int indexOfItemUnderMouseToDrag; 
private int indexOfItemUnderMouseToDrop; 
private Rectangle dragBoxFromMouseDown; 
private Point screenOffset; 
private Cursor MyNoDropCursor; 
private Cursor MyNormalCursor; 
/// The main entry point for the application. 
[STAThread] 
static void Main() 

Application.Run(new Form1()); 

public Form1() 

this.ListDragSource = new System.Windows.Forms.ListBox(); 
this.ListDragTarget = new System.Windows.Forms.ListBox(); 
this.UseCustomCursorsCheck = new System.Windows.Forms.CheckBox(); 
this.DropLocationLabel = new System.Windows.Forms.Label(); 
this.SuspendLayout(); 
// ListDragSource 
this.ListDragSource.Items.AddRange(new object[] {"one", "two", "three", "four", 
"five", "six", "seven", "eight", 
"nine", "ten"}); 
this.ListDragSource.Location = new System.Drawing.Point(10, 17); 
this.ListDragSource.Size = new System.Drawing.Size(120, 225); 
this.ListDragSource.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseDown); 
this.ListDragSource.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.ListDragSource_QueryContinueDrag); 
this.ListDragSource.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseUp); 
this.ListDragSource.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseMove); 
this.ListDragSource.GiveFeedback += new System.Windows.Forms.GiveFeedbackEventHandler(this.ListDragSource_GiveFeedback); 
// ListDragTarget 
this.ListDragTarget.AllowDrop = true; 
this.ListDragTarget.Location = new System.Drawing.Point(154, 17); 
this.ListDragTarget.Size = new System.Drawing.Size(120, 225); 
this.ListDragTarget.DragOver += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragOver); 
this.ListDragTarget.DragDrop += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragDrop); 
this.ListDragTarget.DragEnter += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragEnter); 
this.ListDragTarget.DragLeave += new System.EventHandler(this.ListDragTarget_DragLeave); 
// UseCustomCursorsCheck 
this.UseCustomCursorsCheck.Location = new System.Drawing.Point(10, 243); 
this.UseCustomCursorsCheck.Size = new System.Drawing.Size(137, 24); 
this.UseCustomCursorsCheck.Text = "Use Custom Cursors"; 
// DropLocationLabel 
this.DropLocationLabel.Location = new System.Drawing.Point(154, 245); 
this.DropLocationLabel.Size = new System.Drawing.Size(137, 24); 
this.DropLocationLabel.Text = "None"; 
// Form1 
this.ClientSize = new System.Drawing.Size(292, 270); 
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.ListDragSource, 
this.ListDragTarget, this.UseCustomCursorsCheck, 
this.DropLocationLabel}); 
this.Text = "drag-and-drop Example"; 
this.ResumeLayout(false); 

private void ListDragSource_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 

// Get the index of the item the mouse is below. 
indexOfItemUnderMouseToDrag = ListDragSource.IndexFromPoint(e.X, e.Y); 
if (indexOfItemUnderMouseToDrag != ListBox.NoMatches) { 
// Remember the point where the mouse down occurred. The DragSize indicates 
// the size that the mouse can move before a drag event should be started. 
Size dragSize = SystemInformation.DragSize; 
// Create a rectangle using the DragSize, with the mouse position being 
// at the center of the rectangle. 
dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width /2), 
e.Y - (dragSize.Height /2)), dragSize); 
} else 
// Reset the rectangle if the mouse is not over an item in the ListBox. 
dragBoxFromMouseDown = Rectangle.Empty; 

private void ListDragSource_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { 
// Reset the drag rectangle when the mouse button is raised. 
dragBoxFromMouseDown = Rectangle.Empty; 

private void ListDragSource_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 

if ((e.Button & MouseButtons.Left) == MouseButtons.Left) { 
// If the mouse moves outside the rectangle, start the drag. 
if (dragBoxFromMouseDown != Rectangle.Empty && 
!dragBoxFromMouseDown.Contains(e.X, e.Y)) { 
// Create custom cursors for the drag-and-drop operation. 
try { 
MyNormalCursor = new Cursor("3dwarro.cur"); 
MyNoDropCursor = new Cursor("3dwno.cur"); 
} catch { 
// An error occurred while attempting to load the cursors, so use 
// standard cursors. 
UseCustomCursorsCheck.Checked = false; 
}finally { 
// The screenOffset is used to account for any desktop bands 
// that may be at the top or left side of the screen when 
// determining when to cancel the drag drop operation. 
screenOffset = SystemInformation.WorkingArea.Location; 
// Proceed with the drag-and-drop, passing in the list item. 
DragDropEffects dropEffect = ListDragSource.DoDragDrop(ListDragSource.Items[indexOfItemUnderMouseToDrag], DragDropEffects.All | DragDropEffects.Link); 
// If the drag operation was a move then remove the item. 
if (dropEffect == DragDropEffects.Move) { 
ListDragSource.Items.RemoveAt(indexOfItemUnderMouseToDrag); 
// Selects the previous item in the list as long as the list has an item. 
if (indexOfItemUnderMouseToDrag > 0) 
ListDragSource.SelectedIndex = indexOfItemUnderMouseToDrag -1; 
else if (ListDragSource.Items.Count > 0) 
// Selects the first item. 
ListDragSource.SelectedIndex =0; 

// Dispose of the cursors since they are no longer needed. 
if (MyNormalCursor != null) 
MyNormalCursor.Dispose(); 
if (MyNoDropCursor != null) 
MyNoDropCursor.Dispose(); 




private void ListDragSource_GiveFeedback(object sender, System.Windows.Forms.GiveFeedbackEventArgs e) 

// Use custom cursors if the check box is checked. 
if (UseCustomCursorsCheck.Checked) { 
// Sets the custom cursor based upon the effect. 
e.UseDefaultCursors = false; 
if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move) 
Cursor.Current = MyNormalCursor; 
else 
Cursor.Current = MyNoDropCursor; 


private void ListDragTarget_DragOver(object sender, System.Windows.Forms.DragEventArgs e) 

// Determine whether string data exists in the drop data. If not, then 
// the drop effect reflects that the drop cannot occur. 
if (!e.Data.GetDataPresent(typeof(System.String))) { 
e.Effect = DragDropEffects.None; 
DropLocationLabel.Text = "None - no string data."; 
return; 

// Set the effect based upon the KeyState. 
if ((e.KeyState & (8+32)) == (8+32) && 
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) { 
// KeyState 8 + 32 = CTL + ALT 
// Link drag-and-drop effect. 
e.Effect = DragDropEffects.Link; 
} else if ((e.KeyState & 32) == 32 && 
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) { 
// ALT KeyState for link. 
e.Effect = DragDropEffects.Link; 
} else if ((e.KeyState & 4) == 4 && 
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) { 
// SHIFT KeyState for move. 
e.Effect = DragDropEffects.Move; 
} else if ((e.KeyState & 8) == 8 && 
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) { 
// CTL KeyState for copy. 
e.Effect = DragDropEffects.Copy; 
} else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) { 
// By default, the drop action should be move, if allowed. 
e.Effect = DragDropEffects.Move; 
} else 
e.Effect = DragDropEffects.None; 
// Get the index of the item the mouse is below. 
// The mouse locations are relative to the screen, so they must be 
// converted to client coordinates. 
indexOfItemUnderMouseToDrop = 
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y))); 
// Updates the label text. 
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches){ 
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1); 
} else 
DropLocationLabel.Text = "Drops at the end."; 

private void ListDragTarget_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) 

// Ensure that the list item index is contained in the data. 
if (e.Data.GetDataPresent(typeof(System.String))) { 
Object item = (object)e.Data.GetData(typeof(System.String)); 
// Perform drag-and-drop, depending upon the effect. 
if (e.Effect == DragDropEffects.Copy || 
e.Effect == DragDropEffects.Move) { 
// Insert the item. 
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches) 
ListDragTarget.Items.Insert(indexOfItemUnderMouseToDrop, item); 
else 
ListDragTarget.Items.Add(item); 


// Reset the label text. 
DropLocationLabel.Text = "None"; 

private void ListDragSource_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e) { 
// Cancel the drag if the mouse moves off the form. 
ListBox lb = sender as ListBox; 
if (lb != null) { 
Form f = lb.FindForm(); 
// Cancel the drag if the mouse moves off the form. The screenOffset 
// takes into account any desktop bands that may be at the top or left 
// side of the screen. 
if (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left) || 
((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) || 
((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) || 
((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom)) { 
e.Action = DragAction.Cancel; 



private void ListDragTarget_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { 
// Reset the label text. 
DropLocationLabel.Text = "None"; 

private void ListDragTarget_DragLeave(object sender, System.EventArgs e) { 
// Reset the label text. 
DropLocationLabel.Text = "None"; 



对用这种拖放操作和微软的服务,容器模式的关系,留在以后再学习。

延伸 · 阅读

精彩推荐
  • ASP.NET教程asp.net(c#)ref,out ,params的区别

    asp.net(c#)ref,out ,params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性。但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,params吧,还有它们的区别。...

    服务器之家1362019-06-29
  • ASP.NET教程ASP.NET 前后台调用方法

    ASP.NET 前后台调用方法

    1.JavaScript访问C#函数 2.JavaScript访问C#变量 3.C#中访问JavaScript的已有变量 4.如何在C#中访问JavaScript函数 JavaScript访问C#函数 方法一、 1、首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2、在前台写一个js函数,内容为...

    ASP.NET之家2782019-07-04
  • ASP.NET教程URL重写及干掉ASP.NET试图状态的实现方法

    URL重写及干掉ASP.NET试图状态的实现方法

    URL重写已经很普遍了,但基本上大部分的URL重写都不支持页面的相对路径,所有如果想在已经开发好的项目中添加还是有压力的,第二就是例如微软的那个URL重写是根据正则表达式来处理的,那样是很好,但也有不足之处,就是不...

    asp.net开发网2322019-09-23
  • ASP.NET教程asp.net 处理原文件中过长的viewstate代码

    asp.net 处理原文件中过长的viewstate代码

    asp.net网页原文件中总出现一段很长的viewstate代码看着就头痛 所以在网上找了篇文章解决了这个问题,虽然VIEWSTATE没有完全隐藏,但大大的改善了网页源文件中VIEWSTATE的长度。...

    ASP.NET之家1312019-07-08
  • ASP.NET教程asp.net 支付宝及时到帐接口使用详解

    asp.net 支付宝及时到帐接口使用详解

    这两天写支付宝接口, 这个话题不新了, 因为很多人都 做过了, 在这里我说说我的看法吧, 先说一下实现...

    服务器之家3012019-07-26
  • ASP.NET教程asp.net 获取银行货币汇率的代码

    asp.net 获取银行货币汇率的代码

    这个主要公司做外贸的每天都需要更新汇率,本来以前有一个服务可以调用,但是那个连接用不了 所以就写了一个这样的东西 套取网页显示信息...

    asp.net教程网3422019-09-11
  • ASP.NET教程ASP.NET中内嵌页面代码的一个问题

    ASP.NET中内嵌页面代码的一个问题

    如果页面继承了一个父页面,而且当前页面用new覆盖了父页面的某个属性...

    ASP.NET之家2102019-07-09
  • ASP.NET教程asp.net TIDFtp用法介绍

    asp.net TIDFtp用法介绍

    现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。 ...

    asp.net之家2752019-09-16