首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF DataGrid复制到剪贴板:如何影响剪贴板中的数据格式?

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

Stack Overflow用户
提问于 2014-05-14 07:39:25
回答 2查看 3.2K关注 0票数 4

WPF DataGrid中有很好的默认特性,它将选定的单元格复制到剪贴板中,因此我们可以在其他应用程序中使用它。但是,似乎复制过程在性能上可以得到改进,而且还存在某种类型的.错误在粘贴到excel时我想,需要修复。

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

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

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

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

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

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

B.3)将复制的数据粘贴到excel中。它是预期的,领先的零将被保留,但他们也离开了

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

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

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

C.3)将复制的数据粘贴到excel中。这是预料中,领先的零将被保留,现在它是真的。我们可以看到与源数据相同的数据。所见即所得

我开始查看剪贴板数据,以找出B.1和C.1之间的区别(我还从excel复制了相同的数据,并检查了它.)。在微软的C#剪贴板查看器示例的帮助下,我发现了以下内容:

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

代码语言:javascript
运行
复制
            - Text (native)

            - UnicodeText (native)

            - System.String (autoconvertable)

            - Locale (native)

            - OEMText (native)

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

代码语言:javascript
运行
复制
            - HTML Format (native)

            - Csv (native)

            - Text (native)

            - UnicodeText (native)

            - System.String (autoconvertable)

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

代码语言:javascript
运行
复制
            - 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步骤中解决问题的最佳方法是什么呢?我想知道目前有两种选择:

选项#1

了解如何向wpf数据集解释,它需要以特定格式将数据设置为剪贴板。

选项2

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

对于上述B.3,您认为最好的解决方案是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 16:36:12

好的。既然我说的是从WPF DataGrid复制到剪贴板.我查看了datagrid的源代码(我应该在此之前想出这个想法,而不是问这个问题)。

因此,源中副本处理程序的一部分是:

代码语言:javascript
运行
复制
        // 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是可以的。但是现在我认为继承方法是有意义的。

代码语言:javascript
运行
复制
        protected virtual void OnExecutedCopy(ExecutedRoutedEventArgs args)

这将给我很好的解决所有案件的办法。

票数 3
EN

Stack Overflow用户

发布于 2021-11-10 12:47:22

我发现DataFormats.Html是问题所在。更改Excel目标单元格格式文本。

代码语言:javascript
运行
复制
protected override void OnExecutedCopy(ExecutedRoutedEventArgs args)
{
    base.OnExecutedCopy(args);
    var data = Clipboard.GetDataObject();
    DataObject dataObject = new DataObject();
    foreach (var format in data.GetFormats())
    {
        //We copy all formats, but DataFormats.Html,
        //DataFormats.Html messed up paste in Excel very long number (15 pos +) and leading zero's
        //You need to set the cell format to text before paste
        if (format != DataFormats.Html)
            dataObject.SetData(format, data.GetData(format), true);
    }
    Clipboard.SetDataObject(dataObject);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23648412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档