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的最佳解决方案是什么?
答案 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)
这将为我提供所有案例的良好解决方案。