WPF DataGrid复制到剪贴板:如何影响剪贴板中的数据格式?

时间:2014-05-14 07:39:26

标签: wpf excel datagrid clipboard

WPF DataGrid中有一个很好的默认功能,它将选定的单元格复制到剪贴板中,因此我们可以在其他应用程序中使用它。但看起来,复制过程可以在性能方面得到改善,并且在粘贴到Excel中时会出现某种错误,我认为需要修复。


复制错误的步骤(不正确的Excel使用情况)

A.1)从WPF DataGrid复制单元格,包含带和不带前导零的文本值(例如“001”;“002”;“1”;“12345”;“ABC”;“0ABC”)

A.2)将复制的数据粘贴到excel中。预计会保留前导零,但如果可能,excel会将数值转换为数字数据格式(默认情况下,单元格数据类型为General,它可以执行此操作)。


复制错误的步骤(正确使用Excel)

B.1)从WPF DataGrid复制单元格,包含带或不带前导零的文本值(例如“001”;“002”;“1”;“12345”;“ABC”;“0ABC”)

B.2)选择目标excel文件中的所有单元格,并将单元格数据类型更改为Text

B.3)将复制的数据粘贴到excel中。 预计会保留前导零,但它们也会消失


在Excel中查看预期结果的步骤(正确使用Excel)

C.1)将相同的数据从记事本复制到剪贴板

C.2)选择目标excel文件中的所有单元格,并将单元格数据类型更改为Text

C.3)将复制的数据粘贴到excel中。预计会保留前导零,现在确实如此。我们可以看到与源数据相同。 WYSIWYG


我开始研究剪贴板数据以找出B.1和C.1之间的区别(我也从excel中复制了相同的数据并检查了它...)。我在Microsoft的C#Clipboard Viewer示例的帮助下发现了:

从Notepad ++复制的数据的剪贴板数据格式:

            - Text (native)

            - UnicodeText (native)

            - System.String (autoconvertable)

            - Locale (native)

            - OEMText (native)

从WPF DataGrid复制的数据的剪贴板数据格式:

            - HTML Format (native)

            - Csv (native)

            - Text (native)

            - UnicodeText (native)

            - System.String (autoconvertable)

从Excel复制的数据的剪贴板数据格式:

            - EnhancedMetafile (native)

            - System.Drawing.Imaging.Metafile (autoconvertable)

            - MetaFilePict (native)

            - Bitmap (native)

            - System.Drawing.Bitmap (autoconvertable)

            - System.Windows.Media.Imaging.BitmapSource (autoconvertable)

            - Biff12 (native)

            - Biff8 (native)

            - Biff5 (native)

            - SymbolicLink (native)

            - DataInterchangeFormat (native)

            - XML Spreadsheet (native)

            - HTML Format (native)

            - Text (native)

            - UnicodeText (native)

            - System.String (autoconvertable)

            - Csv (native)

            - Hyperlink (native)

            - Rich Text Format (native)

            - Embed Source (native)

            - Object Descriptor (native)

            - Link Source (native)

            - Link Source Descriptor (native)

            - Link (native)

            - Format129 (native)

那么在步骤B.3中解决问题的最佳方法是什么?我现在想知道2个选项:

选项#1

找出向wpf datagrid解释的方法,它需要以特定格式将数据设置到剪贴板中。

选项#2

第二个选项是使用我自己的函数处理Ctrl + C,它将运行选定的单元格,与数据网格后面的视图对话,获取正确的数据,附加到字符串构建器并将文本设置到剪贴板。

您认为上述B.3的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:3)

确定。所以,因为我正在谈论从WPF DataGrid复制到剪贴板......我查看了数据网格的源代码(我之前应该提出这个想法而不是问这个问题。)

所以,源代码中部分复制处理程序是:

        // Supported default formats: Html, Text, UnicodeText and CSV
        Collection<string> formats = new Collection<string>(new string[] { DataFormats.Html, DataFormats.Text, DataFormats.UnicodeText, DataFormats.CommaSeparatedValue });

如此简单的答案是:选项#1是不可能的(换句话说 - 剪贴板的sinse数据格式是硬编码的 - 不可能影响它)。选项#2没问题。但是现在我认为继承datagrid和覆盖方法

是有意义的
        protected virtual void OnExecutedCopy(ExecutedRoutedEventArgs args)

这将为我提供所有案例的良好解决方案。