繁体   English   中英

C#剪切/复制和粘贴对象

[英]C# Cut/Copy & Paste objects

这是2份。

首先,我有一点时间让复制和粘贴操作的粘贴部分起作用。

我有一种将信息复制到剪贴板的方法,效果很好。

private void CopyData(string format, object data, string text)
    {
        bool addedData = false;
        DataObject copyData = new DataObject();

        if (!string.IsNullOrEmpty(text))
        {
            copyData.SetData(DataFormats.Text, text);
            addedData = true;
        }

        if (!string.IsNullOrEmpty(format) && data != null)
        {
            copyData.SetData(format, false, data);
            addedData = true;

            //this is only for testing
            object obj = null;
            if (copyData.GetDataPresent(format))
                obj = (object)copyData.GetData(format);
        }

        if (addedData)
            Clipboard.SetDataObject(copyData, true);
    }

当我检查是否已添加数据时,对象(obj)不为null。

但是,当我然后使用相同的格式键通过另一种方法粘贴数据时,每次都为null。

private void PasteFromClipboard()
    {
        object obj = null;
        IDataObject paste = null;
        if (Clipboard.GetDataObject().GetDataPresent("mydatatype"))
            obj = (object)Clipboard.GetDataObject().GetData("mydatatype");
        else
            return;

        if (obj == null)
            throw new NullReferenceException("Could not gather information from the 
    }

我已经尝试了所有我能想到的东西,但这只是没有意义。 我创建了一个字符串数组来捕获DataObject持有的所有格式键,而“ mydatatype”是第一个。 我尝试使用(Clipboard.GetDataObject().GetData("mydatatype") as object)强制转换,而不是强制转换,但我只是无法弄清楚。 我知道那里有数据,因为我可以转到记事本并粘贴与对象一起复制的文本。

关于为什么我能够以一种方法而不是另一种方法获取数据的想法?

其次,我想知道如何在两个窗口之间进行剪切和粘贴操作。 我正在考虑类似Excel的东西,如果仅粘贴文本,则数据将保留,但是如果粘贴对象,则将删除源。

谢谢帕特里克。

尝试以文本形式(而不是“ mydatatype”)提取数据-至少确认您可以从剪贴板中读取数据。 这很可能是记事本正在阅读的内容。 另外,使用“格式”进行复制但使用“ mydatatype”进行粘贴是否重要?

可能是text参数始终有一个值并被设置了。 如果设置对象的对象未执行,则可能是第二个对象。 或者,如果是这样,因为数据是在第一个if语句中设置的,那么第二组将无法正确设置它。

我的建议是在复制操作期间在调试器中遍历代码。

粘贴之前,请使用GetDataObject()。GetFormats()枚举格式代码列表。 也许您使用的是错误的..只是一个想法

尝试使用反射,如下所示:

    private static T TryGetClipboardData<T>(IDataObject clipboardData, string dataFormat)
    {
        System.Reflection.FieldInfo fieldInfo = clipboardData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var outerData = fieldInfo.GetValue(clipboardData);

        if (outerData == null)
        {
            return default(T);
        }

        fieldInfo = outerData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var innerData = fieldInfo.GetValue(outerData);

        if (innerData is System.Runtime.InteropServices.ComTypes.IDataObject)
        {
            // It is (probably) necessary to wrap COM IDataObject to Windows.Forms.IDataObject
            System.Windows.Forms.DataObject wrappedDataObject = new System.Windows.Forms.DataObject(innerData);

            var data = wrappedDataObject.GetData(dataFormat);

            if (data is T)
            {
                return (T)data;
            }
        }

        return default(T);
    }

我怀疑剪贴板中数据的COM对象很难将其自身转换为您指定的格式。 我还在使用输入格式字符串进行安全播放,以便将其注册为正确的剪贴板格式。

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM