【问题标题】:Drag&Drop WinForm UserControl object拖放 WinForm 用户控件对象
【发布时间】:2016-03-16 09:57:33
【问题描述】:

我正在尝试 d&d 我创建的 UserControl。 这是用户控件:

例如,我在FlowLayotPanel 中有两个这样的UserControls。当我将一个UserControl 拖到另一个时,我想合并UserControl 数据。合并他们的标签和图像。

根据this article,我无法将可拖动的 UserControl 作为参数传递给 DoDragDrop 函数。

我现在正在做的事情是这样的:

        string dataString = "";

        dataString += barcodeLabel.Text + "~";

        string sImg64bit = ImageToBase64(scannedDocImg, ImageFormat.Bmp);

        dataString += sImg64bit;

        DoDragDrop(dataString, DragDropEffects.Copy);   

我只是以字符串格式传递数据。我不认为这是个好主意? 还有其他方法可以传递可拖动数据吗?有什么想法吗?

【问题讨论】:

  • 那篇文章没有这样说。您可以拖动任何您想要的东西,传递该用户控件的实例就可以了。在 DragEnter 事件处理程序中使用 e.Data.GetDataPresent(typeof(YourUserControl)) 。尽量让它被发现,用户永远不会知道 D+D 可以在没有手册的情况下工作。即使开始拖动也很困难,没有什么可点击的。
  • @HansPassant 成功了

标签: c# winforms user-controls draggable


【解决方案1】:

感谢@HansPassant,我意识到答案就在我的眼皮底下

这是我所做的:

  private void ScannedDocContainer_MouseDown(object sender, MouseEventArgs e)
  {
     DoDragDrop((ScannedDocContainer)sender, DragDropEffects.Copy);    
  }

  private void ScannedDocContainer_DragDrop(object sender, DragEventArgs e)
  {
     if (e.Data.GetDataPresent(typeof(ScannedDocContainer)))
     {
        ScannedDocContainer docContainerDragged = (ScannedDocContainer)e.Data.GetData(typeof(ScannedDocContainer));
        ...
        "Extract the required data here"
        ...
     }
  }

这样我得到的是整个拖动的用户控件

【讨论】:

  • 这看起来不太正确。 GetDataPresent() 调用属于 DragEnter 事件处理程序,您可以使用它来设置 e.Effect 属性。您不必在 DragDrop 事件处理程序中再次检查它,因为您的 DragEnter 处理程序已经检查了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多