2009-11-09 91 views
4

我有一個問題,從我的C#winforms應用程序拖入一個HTML表格到一個外部應用程序(Outlook電子郵件消息),並獲取它作爲表格而不是純文本版本的那張桌子。我知道當你在剪貼板中複製/粘貼時,你必須將表格放在CF_HTML format中,但這似乎不能幫助你拖動表格。有誰知道我錯過了什麼?拖放一個HTML表格到另一個應用程序

+0

winforms中的html表格是什麼?你的意思是webforms? – Kugel 2009-11-09 02:40:01

+0

不,我生成的HTML代碼(作爲字符串),當用戶在應用程序中單擊並拖動網格,然後將其作爲.DoDragDrop方法的數據參數發送時。 – JohnMcCon 2009-11-09 03:07:26

+0

你是說當你複製和粘貼它的作品,但拖放不起作用? – Chris 2009-11-09 05:13:33

回答

7

ObjectListView支持將文本和HTML版本中的行從ListView複製並拖拽到其他應用程序。要做到這一點,但它確實是這樣的:

DataObject dataObject = new DataObject(); 
this.CreateTextFormats(dataObject); 
Clipboard.SetDataObject(dataObject); 

要做到拖放,代碼幾乎是相同的:

DataObject dataObject = new DataObject(); 
this.CreateTextFormats(dataObject); 
DragDropEffects effect = this.DoDragDrop(dataObject, DragDropEffects.All);     

CreateTextFormats()並不複雜:

public void CreateTextFormats(DataObject do) { 
    string textVersion; 
    string htmlVersion; 
    // Do the work of making the tab-separated text version and the HTML code 
    do.SetData(textVersion); 
    do.SetText(ConvertToHtmlFragment(htmlVersion), TextDataFormat.Html); 
} 

正確獲取HTML格式需要更長時間:

/// <summary> 
/// Convert the fragment of HTML into the Clipboards HTML format. 
/// </summary> 
/// <remarks>The HTML format is found here http://msdn2.microsoft.com/en-us/library/aa767917.aspx 
/// </remarks> 
/// <param name="fragment">The HTML to put onto the clipboard. It must be valid HTML!</param> 
/// <returns>A string that can be put onto the clipboard and will be recognized as HTML</returns> 
private string ConvertToHtmlFragment(string fragment) { 
    // Minimal implementation of HTML clipboard format 
    string source = "http://www.codeproject.com/KB/list/ObjectListView.aspx"; 

    const String MARKER_BLOCK = 
     "Version:1.0\r\n" + 
     "StartHTML:{0,8}\r\n" + 
     "EndHTML:{1,8}\r\n" + 
     "StartFragment:{2,8}\r\n" + 
     "EndFragment:{3,8}\r\n" + 
     "StartSelection:{2,8}\r\n" + 
     "EndSelection:{3,8}\r\n" + 
     "SourceURL:{4}\r\n" + 
     "{5}"; 

    int prefixLength = String.Format(MARKER_BLOCK, 0, 0, 0, 0, source, "").Length; 

    const String DEFAULT_HTML_BODY = 
     "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" + 
     "<HTML><HEAD></HEAD><BODY><!--StartFragment-->{0}<!--EndFragment--></BODY></HTML>"; 

    string html = String.Format(DEFAULT_HTML_BODY, fragment); 
    int startFragment = prefixLength + html.IndexOf(fragment); 
    int endFragment = startFragment + fragment.Length; 

    return String.Format(MARKER_BLOCK, prefixLength, prefixLength + html.Length, startFragment, endFragment, source, html); 
} 
+1

正是我需要的,謝謝。 – JohnMcCon 2009-11-10 14:53:22

+0

真棒,巨大的幫助,非常感謝! – yoyo 2011-10-05 22:48:01

+2

很好的例子!一個補充,雖然:正確地複製特殊字符(例如,ÄÖääöüß),我已經在ConvertToHtmlFragment函數的開頭添加此行: fragment = Encoding.Default.GetString(Encoding.UTF8.GetBytes(分段)); (取自:http://msdn.microsoft.com/en-us/library/windows/desktop/ms649015(v=vs.85).aspx) – 2011-10-20 10:35:31

0

如果您不需要格式化,只需將它作爲製表符分隔的文本複製到剪貼板即可。這樣它就會在Excel中粘貼成一張表格,並且可以推測大多數其他與表格兼容的應用程序。

+0

我確實需要html提供的格式,所以分隔表格不是一個選項。 – JohnMcCon 2009-11-09 05:49:32

相關問題