Winform拖放到Excel中
我想从我的winform拖放到Excel中。 例如,在Winform中按住button(或DataGridView中的一行),然后将其拖放到Excel单元格中,将执行一些操作或将一些数据写入Excel单元格。
我正在谈论的是winform和Excel之间的拖放,而不是winform组件之间的拖放。
我记得曾经看过一个例子,但在Google上找不到。
更新:按照Avantol13的回答,
我们如何提取发送给Excel的对象? 在这个例子中,将string写入单元格是一种诡计,然后检查单元格的内容以执行进一步的操作。 也许类似于DragDrop事件,我们可以提取从e.Data.GetData(e.Data.GetFormats()[0])发送的数据
此外,使用Application_SheetChange
知道这个drop事件会导致它循环为Application_SheetChange
– >修改单元格的代码(如下例所示)(删除单元格并写入新的内容) – >再次触发Application_SheetChange
等。
提前致谢。
Sean Sexton就如何将数据从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); }
根据Avantol13的build议,我想出了一个办法。
当Excel表单被修改时,挂钩Excel_Drop事件
Application.SheetChange += new AppEvents_SheetChangeEventHandler(Excel_Drop);
对于启动拖动的button:
private void _Button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DragDropEffects dde1 = DoDragDrop("Action1", DragDropEffects.All); } }
另一个button将发送“Action2”作为标志。
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
– >其中调用DoActionx(),再次修改表 – >轮stream重新启动Excel_drop
,我阻止事件。
然而,基于这种使用文本标志的方法仍然有几个缺点:
-
在winform组件之间拖动时,我不能发送除文本之外的任何东西作为拖动对象。 因此,我需要让文本标志发送,删除它,并采取我的行动。 除了黑客之外,我无法validation“只有当单元格为空时才执行操作”,因为这个单元格无论如何都会覆盖掉我的单元格。 任何build议是受欢迎的。
-
我们如何能发送任何东西作为拖动对象?