2015-05-19 72 views
2

我想从我的winform拖放到Excel中。例如,在Winform中按住按钮(或DataGridView中的一行)并将其拖放到Excel单元格中将执行一些操作或将一些数据写入Excel单元格。Winform拖放到Excel中

我说的是winform和Excel之间的拖放,而不是winform组件之间的拖放。

我记得曾经看过一个例子,但在Google上找不到它。

更新:继Avantol13答案,

我们如何提取发送到Excel中的对象?在这个例子中,让字符串写入单元格是一种诡计,然后检查单元格的内容以执行进一步的操作。也许类似于DragDrop事件,我们可以提取从e.Data.GetData(e.Data.GetFormats()[0])发送的数据。

此外,使用Application_SheetChange知道drop事件将导致它循环为Application_SheetChange - >修改单元格的代码(如示例中所示)(删除单元格并写入新内容) - >再次触发Application_SheetChange

在此先感谢。

+2

[This](https://msdn.microsoft.com/en-us/library/bb840032(v=office.12).aspx)可能是你正在寻找的。稍微过时,但仍可能适用于您的情况 – Avantol13

+0

谢谢Avantol13。这是我正在寻找的。一个问题:我们如何提取发送给Excel的对象?在这个例子中,让字符串写入单元格是一种诡计,然后检查单元格的内容以执行进一步的操作。也许类似DragDrop事件,我们可以提取从e.Data.GetData(e.Data.GetFormats()[0])发送的数据 – Kenny

+0

我会用你刚刚描述的细节更新你的问题,或许有更好的知识的人这可以回答。 – Avantol13

回答

1

Sean Sexton provides an excellent example关于如何拖动&将数据从WPF窗口拖放到Excel中。我修改了他的示例,以便它可以与WinForms一起使用。 试试这个:

private void control_MouseDown(object sender, MouseEventArgs e) 
{ 
    List<string> stringItems = new List<string>() { "Value1", "Value2", "Value3" }; 

    //Separate all values with tabs 
    string someValues = string.Join("\t", stringItems); 

    DataObject data = new DataObject(DataFormats.Text, someValues); 
    DoDragDrop(data, DragDropEffects.Copy); 
} 
+0

这仍将仅发送文本作为拖动对象。它被写入连续单元格的事实是因为文本是以逗号分隔的。我认为我们不能说例如“写入栏” – Kenny

0

我想出了一个办法基于由Avantol13建议这样做。

挂钩Excel_Drop事件时,Excel的表被修改

Application.SheetChange += new AppEvents_SheetChangeEventHandler(Excel_Drop); 

。对于其中的阻力发起的按钮:

private void _Button1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       DragDropEffects dde1 = DoDragDrop("Action1", DragDropEffects.All); 
      } 
     } 

另一个按钮就会发出 “措施2” 为标志。

private void Excel_Drop(object dropObj, Range target) 
    { 
     String dragData = Convert.ToString(target.Value2); 

     if (dragData.Equals("Action1")) 
     { 
      Application.SheetChange -= Excel_Drop; 
      DoAction1(); 
      Application.SheetChange += Excel_Drop; 
      return; 
     } 
     if (dragData.Equals("Action2")) 
     { 
      Application.SheetChange -= Excel_Drop; 
      DoAction2(); 
      Application.SheetChange += Excel_Drop; 
      return; 
     } 
    } 

为了解决循环问题:丢弃事件触发Excel_drop - >它调用修饰在重新火Excel_drop,我阻止事件匝片材再次 - > DoActionx()。

但是也有仍然在使用文本标志的这种方法几个缺点基地:

  1. 的WinForm组件之间的DragDrop当我不能除了文本发送任何作为拖动对象像here。因此,我需要让文本标志发送,删除它并执行我的操作。除了黑客攻击之外,我无法验证“仅在单元格为空时执行操作”,因为丢弃操作会用标志覆盖我的单元格。 欢迎任何推荐。

  2. 我们如何发送任何东西作为拖动对象?