2015-05-19 37 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. 我們如何發送任何東西作爲拖動對象?