介绍 这显示了一个带
有两个列表框的windows窗体应用程序。商品的原因 左列表框(列表框1)可以拖动到右列表框(列表框2)。项目 可以重新安排或删除右listBox2。拖放事件是 被困并报告在第三个列表框和信息标签。隐藏,复制code
DragDrop
事件被高度检测和报告。 背景 这篇文章试图传达我对机制、事件、 对象后的拖放操作所涉及的隐藏对象 几天的实验。本文希望解释 “选定”的数据项是在开始时临时存储和拖放的数据 项目在“删除”时间被检索。 拖放操作在很大程度上依赖于异步事件。我发现 在VS调试器中使用断点跟踪这些事件很困难。 因此,从每个事件内部,我写出各种值到第三个或 底部listbox3和一个信息标签1。为清晰起见,以下代码 生成信息显示(涉及listBox3和label1的行) 显示在后面的代码部分讨论中。 使用的代码 这个示例的预期应用程序需要允许用户选择 从固定的列集(由左表示)中期望得到的列集 列表框listBox1)。用户通过拖动选择要取消显示的列 从左到右的列表框(listBox2)。此外应用程序 需要允许用户移动或重新排列右列表框中的列 并可任意删除一个或多个,全部使用拖放操作。 当用户左键单击左侧listBox1中的一个项目时,鼠标向下移动事件 是解雇。列名称(如纬度等)索引在左列表框 (实际上是一个字符串)是使用listBox方法“Index”计算的 从光标位置”。如果索引是有效的(即,索引是 魔术的DoDragDrop方法被调用。 这个事件是这样的 MouseDown事件启动一个DoDragDrop操作复制Code
private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { int indexOfItem = listBox1.IndexFromPoint(e.X, e.Y); if(indexOfItem >= 0 && indexOfItem < listBox1.Items.Count) // check we clicked down on a string { // Set allowed DragDropEffect to Copy selected // from DragDropEffects enumberation of None, Move, All etc. listBox1.DoDragDrop(listBox1.Items[indexOfItem], DragDropEffects.Copy ); } }
所有的控件(文本框,列表框按钮,等等都有一个隐藏复制可以以类似方式调用的Code
DoDragDrop
method (control.DoDragDrop)。该方法到达每个控件(文本框, 列表框,按钮,等等),因为他们都是从更多派生(继承) 主要基地“控制”。 如果你看控制。方法,您将看到 第一个必需的参数是一个IDataObject类型的对象 在这个例子中一个字符串对象是从一个字符串数组中抓取的吗 构成左列表框的项集合的核心)。第二个 参数的allowedEffect DragDropEffect 所有DragDropEffects的选择枚举列表 “所有”、“复制”,“链接”, “移动”、“无”和“滚动”。在这里我想要 允许通过拖放复制左listBox1中的字符串。 因此参数2被设置为" dragdropeffies . copy " 到目前为止一切都很好。MouseDown块上的执行是 listBox1_MouseDown完成了它的工作。执行 等待下一个事件。但是我想要移动的弦发生了什么变化? 这是隐藏的魔法值得伟大的安德斯H.在某处 在你的电脑内部,DoDragDrop已经为你创建了一个对象。它是 类型为DataObject的对象,但与对象相似 左边的listBox1是一个对象,其中的项是对象的数组 字符串类型。在这个数据对象中隐藏了您选择的列表框1 字符串项(字符串类型对象)。点击“方位” 左列表框和你的字符串将是“轴承”。 但是我如何从数据对象中取回这个字符串 准备把它放在右手列表框?更多的魔法。一旦你开始了 运动DoDragDrop操作,可以说泵是启动的。 将光标放在左边列表框中的一个项目上,按住鼠标左键 按钮,然后看光标。它变成了一个“拖放”复制符号。如果 继续拖动到listBox2(其隐藏复制Code
listBox2.AllowDrop
property = true),隐藏复制Code
listBox2.DragEnter
event触发。在此事件的参数中,将向您传递对 对象中初始化的DoDragDrop调用创建的 listBox1_MouseDown事件。隐藏在事件参数“e”是你的 字符串。它是一个类型的对象 System.Windows.Forms。的DragEventArgs,并传递给您 DoDragDrop方法。以下是这次活动的要点 代码: 当拖动光标进入右边时触发DragEnter事件 listBoxHide,复制Code
private void listBox2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { // change the drag cursor to show valid data ready if (e.Data.GetDataPresent(DataFormats.StringFormat) && (e.AllowedEffect == DragDropEffects.Copy|DragDropEffects.Move) ) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.Move; }
你如何得到你的字符串?召唤隐藏复制Code
DragEventArg
object e的方法 e.Data.GetData。埋在那里的是你的弦 您看到显示在信息listBox3项目刚刚添加! 在这里,我们通过保持光标向用户表明复制操作是有效的 形状反射假设拖放操作进入了一个区域 复制是合适的(还记得剪贴板操作中的Cntrl + C吗?C 复制同样的想法)。对于钻头,在上面的块上放一个断点,然后再放一个 关注“e”。继续向下钻取,点击+符号。最终你会 揭开你选择的绳子。演示代码进一步询问了奇妙的事物 DragEventArgs对象来显示它的一些信息 然后,contains将此报告给底部的listBox3。 在这里,我们还要检查数据对象是否合理和 而不是语言环境、调色板、位图或其他您可以使用的格式 合法的拖放。(参见Visual Studio .NET文档中的完整列表 正在搜索“DataFormat类”)。 我们可以得到我们的字符串 typeDataFormat。StringFormat和可从调用中检索 getdata),我们如何插入它到右手列表框? 继续阅读… 在光标更改后的最后几行中 listBox2_DragEnter事件块(上面),在代码DragEnter上执行 块以上终止。然后,DoDragOperation触发 listBox2_DragOver事件(下面)多次。这个发射 快速填充您的信息列表框(listBox3)。这是隐藏的地方复制code
DragOver
事件如下: 拖放事件反复触发。插入下降索引 listBox2确定。隐藏,复制Code
private void listBox2_DragOver(object sender, System.Windows.Forms.DragEventArgs e) { indexOfItemUnderMouseToDrop = listBox2.IndexFromPoint(listBox2.PointToClient( new Point(e.X, e.Y))); if (indexOfItemUnderMouseToDrop != ListBox.NoMatches) { label1.Text = "\'"+e.Data.GetData(DataFormats.Text)+"\'"+ " will be placed before item #" + (indexOfItemUnderMouseToDrop + 1)+ "\n which is "+ listBox2.SelectedItem; listBox2.SelectedIndex = indexOfItemUnderMouseToDrop; } else { label1.Text = "\'"+e.Data.GetData(DataFormats.Text)+ "\'"+ " will be added to the bottom of the listBox." ; listBox2.SelectedIndex = indexOfItemUnderMouseToDrop; } if(e.Effect == DragDropEffects.Move) listBox2.Items.Remove((string)e.Data.GetData(DataFormats.Text)); // fill the info listBox }
正如我所说的,这个事件被重复而快速地执行。在这里,你确定 在数据对象中传递的字符串将被放置的位置。你确定 预期的插入索引,首先翻译拖动事件的 鼠标屏幕坐标e。X和e。Y到客户端 listBox2的坐标。通过调用to完成转换 listBox2。PointToClient()然后调用 listBox2。IndexFromPoint可以完成它的工作,并告诉我们在哪个上面 项目,光标被定位。我们把索引保存进去 在下一个事件中使用的indexOfItemUnderMouseToDrop。 最后,当你松开鼠标左键时,隐藏按钮就会出现。复制code
DoDragDrop
操作导致listBox2_DragDrop事件的执行 如下所示。这里你要确保索引是有效的(隐藏 复制Code
index >=0
但是<总字符串)。如果插入索引为 当有效时,我们调用e.Data.GetData()并插入检索的值 字符串。如果索引无效,检索到的索引将隐藏。复制code
string
只是简单地添加到listbox . items的集合中。 在MouseButtonUp时触发DragDrop - 字符串插入到列表框中复制Code
private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { if(e.Data.GetDataPresent(DataFormats.StringFormat)) // dropped data still a string? { if(indexOfItemUnderMouseToDrop >= 0 && indexOfItemUnderMouseToDrop < listBox2.Items.Count) { listBox2.Items.Insert(indexOfItemUnderMouseToDrop, e.Data.GetData(DataFormats.Text)); } else { // add the selected string to bottom of list listBox2.Items.Add(e.Data.GetData(DataFormats.Text)); } } }
listBox QuertyContinuingDrag事件取消隐藏如果游标在Form1之外出现异常,复制CodeDragDrop listBox1和listBox2都有委托事件,它们只做其他事情 取消DoDragDrop操作,如果同时按住左键并 拖动,您将游走在Form1的边界之外。(我用的密码是 从M$。net文档中截取控件。DoDrapDrop方法。)的 文件显示,这个事件是在隐藏后触发的。复制code
DoDragDrop
操作开始,“如果键盘或鼠标有变化 按钮状态”。在我看来,鼠标移动也会触发这个事件。的 事件代码是相同的forlistBox1_QueryContinuingDrag事件 为listBox2_QueryContinueDrag even。这是开始 listBox1_QueryContineDrag:隐藏,复制Code
private void listBox1_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e)
事件参数允许访问某些隐藏。复制Code
DragDrop
operational属性。e。可以设置为 DragAction。取消以停止悬垂操作 如果你在外面闲逛,这是你想要的操作 Form1。如果您不取消外部Form1,您可以删除您的 选择字符串的任何地方,包括VisualStudio的编辑器。(意外和 当然讨厌)。一旦多余的字符串被转储,下一个构建就会 抱怨不知道方位或距离等是什么。 重新排序或重新安排右侧列表框中的项 回想一下,我的应用程序需要一种方法来允许右listBox2 要删除或重新排列的条目。这个功能是这样的 完成。 如果单击鼠标左键并将其放在右侧列表框2中, 相应的listBox2_MouseDown事件被触发。项目 鼠标下是通过获取它的索引和隐藏来确定的。复制code
DoDragDrop
操作被触发。龙和隐藏复制code
DragOver
事件的触发顺序与前面相同。新索引 确定插入点,并在释放鼠标左键时插入 按钮。 系统是如何分辨普通鼠标和拖放鼠标的 运动。 拖放操作直到鼠标左键才会触发 按下按钮,鼠标光标移动系统设置的像素数 。这个数字是在SystemInformation.DragSize中确定的。在我的 在电脑上,我必须按住左键,然后光标向左移动4个像素 向右、向上或向下启动一个拖放操作 游标ch安吉。(在我的SystemInformation。DragSize == 4). This 防止在控件中启动简单的左键单击或多次单击 DragDrop。 历史 版本1发布:2004年1月。 本文转载于:http://www.diyabc.com/frontweb/news190.html