【问题标题】:Drag and drop a html table into another application将 html 表格拖放到另一个应用程序中
【发布时间】:2010-12-14 12:04:17
【问题描述】:

我在将 html 表格从 C# winforms 应用程序拖入外部应用程序(Outlook 电子邮件)并将其呈现为表格而不是该表格的纯文本版本时遇到问题。我知道当您在剪贴板中复制/粘贴时,您必须将表格放在CF_HTML format 中,但这似乎无助于拖动表格。有谁知道我错过了什么?

【问题讨论】:

  • winforms中有什么html表格?你是说网络表单吗?
  • 不,当用户在我的应用程序中单击并拖动网格然后将其作为 .DoDragDrop 方法的数据参数发送时,我正在生成 html 代码(作为字符串)。
  • 你是说复制粘贴的时候可以,拖拽不行?

标签: c# html winforms drag-and-drop


【解决方案1】:

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);
}

【讨论】:

  • 很好的例子!不过还有一个补充:为了正确复制特殊字符(例如 Ä Ö Ü ä ö ü ß),我在 ConvertToHtmlFragment 函数的开头添加了这一行:fragment = Encoding.Default.GetString(Encoding.UTF8.GetBytes(fragment) ); (取自:msdn.microsoft.com/en-us/library/windows/desktop/…)
【解决方案2】:

如果您不需要格式化,只需将其作为制表符分隔的文本复制到剪贴板即可。这样,它将作为表格粘贴到 Excel 中,并且可能是大多数其他表格兼容的应用程序。

【讨论】:

  • 我确实需要 html 提供的格式,所以分隔表不是一个选项。
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多