我想从我的winform拖放到Excel中。例如,在Winform中按住按钮(或DataGridView中的一行)并将其拖放到Excel单元格中将执行某些操作或将一些数据写入Excel单元格。
我说的是winform和Excel之间的拖放,而不是winform组件之间的拖放。
我记得曾经见过一个例子,但在Google上找不到它。
更新:按照Avantol13的回答
我们如何提取发送到Excel的对象?在该示例中,将字符串写入单元格,然后检查该单元格的内容以执行进一步操作是一种破解。也许类似于DragDrop事件,我们可以提取从e.Data.GetData发送的数据(e.Data.GetFormats()[0])
此外,使用Application_SheetChange
了解丢弃事件会导致其循环为Application_SheetChange
- >修改单元格的代码,如示例中所示(删除单元格并写入新内容) - >再次触发Application_SheetChange
等等。
提前致谢。
答案 0 :(得分: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);
}
答案 1 :(得分:0)
根据Avantol13的推荐,我想出了一种方法。
修改Excel工作表时挂起Excel_Drop事件
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);
}
}
另一个按钮会将“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
- &gt;调用DoActionx()再次修改工作表 - &gt;依次重新触发Excel_drop
,我阻止事件。< / p>
然而,这种使用文本标志的方法仍存在一些缺点:
在winform组件之间进行拖放时,我无法发送除文本之外的任何内容作为here之类的拖动对象。因此,我需要发送文本标志,删除它并执行我的操作。除了成为一个黑客,我无法验证“只有当单元格为空时才执行操作”,因为丢弃将覆盖我的单元格,无论如何。 欢迎提出任何建议。
我们如何以拖拽对象的形式发送任何内容?