2009-11-09 4 views
4

Je n'arrive pas à faire glisser une table html de mon application C# winforms dans une application externe (message Outlook) et à l'obtenir en tant que table au lieu d'une version en texte brut de cette table. Je sais que lorsque vous copiez/collez dans le presse-papiers, vous devez mettre la table dans CF_HTML format mais cela ne semble pas aider à faire glisser la table. Est-ce que quelqu'un sait ce que je manque?Glisser et déposer une table html dans une autre application

+0

Quelle table html dans Winforms? Voulez-vous dire webforms? – Kugel

+0

Non, je génère le code html (sous la forme d'une chaîne) lorsqu'un utilisateur clique et fait glisser une grille dans mon application, puis l'envoie en tant que paramètre de données de la méthode .DoDragDrop. – JohnMcCon

+0

Voulez-vous dire que lorsque vous copiez et collez cela fonctionne, mais le glisser-déposer ne fonctionne pas? – Chris

Répondre

7

ObjectListView prend en charge la copie et le déplacement des lignes d'un ListView vers d'autres applications, dans les versions texte et HTML. Pour ce faire, il fait quelque chose comme ceci:

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

Pour faire glisser-déposer, le code est pratiquement le même:

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

CreateTextFormats() est pas compliqué:

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

L'obtention du format HTML a pris plus de temps:

/// <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

Exactement ce dont j'avais besoin, merci. – JohnMcCon

+0

Génial, énorme aide, merci beaucoup! – yoyo

+2

Bon exemple! Un ajout cependant: pour copier correctement les caractères spéciaux (par exemple Ä Ö Ü ä ö ü ß), j'ai ajouté cette ligne au début de la fonction ConvertToHtmlFragment: fragment = Encoding.Default.GetString (Encoding.UTF8.GetBytes (fragment)); (tiré de: http://msdn.microsoft.com/fr-fr/library/windows/desktop/ms649015(v=vs.85).aspx) –

0

Si vous n'avez pas besoin de formatage, copiez-le simplement dans le presse-papiers sous forme de texte délimité par des tabulations. De cette façon, il va coller comme une table dans Excel, et présumable la plupart des autres applications compatibles avec la table.

+0

J'ai besoin de la mise en forme offerte par html pour que les tables délimitées ne soient pas une option. – JohnMcCon

Questions connexes