Winform Drag Drop into excel

时间:2015-05-19 15:28:42

标签: c# excel winforms datagridview drag-and-drop

我想从我的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等等。

提前致谢。

2 个答案:

答案 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>

然而,这种使用文本标志的方法仍存在一些缺点:

  1. 在winform组件之间进行拖放时,我无法发送除文本之外的任何内容作为here之类的拖动对象。因此,我需要发送文本标志,删除它并执行我的操作。除了成为一个黑客,我无法验证“只有当单元格为空时才执行操作”,因为丢弃将覆盖我的单元格,无论如何。 欢迎提出任何建议。

  2. 我们如何以拖拽对象的形式发送任何内容?