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

时间:2010-01-19 22:30:16

标签: c#

这是一个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。

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)进行投射,而不是投射,我只是想不出来。我知道那里有数据,因为我可以去NotePad并粘贴我与对象一起复制的文本。

有关为什么我能够在一种方法中获取数据而不是另一种方法的任何想法?

其次,我想知道如何制作Cut&粘贴我的两个窗口之间的操作工作。我正在考虑像Excel这样的东西,如果只粘贴文本,数据将保留,但是如果粘贴了对象,那么源将被删除。

由于 帕特里克。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

可能是文本参数始终具有值并且已设置。然后可能是第二个,如果设置对象的那个没有被执行。或者如果由于数据是在第一个if语句中设置的,那么第二个集合无法正确设置它。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

尝试使用这样的反射:

    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对象很难将自身转换为您指定的格式。我也使用输入格式字符串安全播放,以便将其注册为正确的剪贴板格式。

HTH