2009-07-29 8 views

Répondre

2

OK, j'ai compris comment le faire, mais ce n'est pas vraiment élégant. Tout d'abord, j'ai levé la fonction CopyClipboard de Jeff Wilcox's Blog.

Maintenant, j'ai écrit du code pour générer un tableau HTML à partir de la grille, et le mettre dans le presse-papiers.

private void Clipboard_Button_Clicked(object sender, RoutedEventArgs e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<TABLE>"); 
     foreach (object obj in myDataGrid.ItemsSource) 
     { 
      sb.Append("<TR>"); 
      foreach (DataGridColumn c in myDataGrid.Columns) 
      { 
       sb.Append("<TD>"); 
       FrameworkElement el = c.GetCellContent(obj); 
       TextBlock tb = el as TextBlock; 
       if (tb != null) 
       { 
        string s = tb.Text; 
        sb.Append(System.Windows.Browser.HttpUtility.HtmlEncode(tb.Text)); 
       } 
       sb.Append("</TD>"); 
      } 
      sb.Append("</TR>"); 
     } 
     sb.Append("</TABLE>"); 
     Clipboard.SetText(sb.ToString()); 
    } 

Il est particulièrement mauvais parce qu'il appelle

clipboardData.Invoke("setData", "text", text); 

plutôt que

clipboardData.Invoke("setData", "text/html", text); 

Parce que le second lance une exception "System.InvalidOperation". Cela signifie que si vous le copiez dans Word au lieu d'Excel, ce n'est pas un tableau, c'est un bloc de HTML. Mais, oui, copier le contenu du DataGrid vers Excel via le presse-papiers est possible. Sorte de.

+0

Le hack flash est assez sauvage, mais grâce à un lien vers elle. J'espère que nous ajouterons un meilleur support de presse-papiers à une future version de Silverlight, il serait utile pour les grilles avancées et autres contrôles. –

Questions connexes