簡體   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