2012-01-27 39 views
8

Tôi đang cố sao chép một đối tượng vào khay nhớ tạm của cửa sổ và tắt một lần nữa. Mã của tôi là như thế này:Clipboard Sao chép các đối tượng đến và đi từ

Sao chép vào clipboard:

Clipboard.Clear(); 
DataObject newObject = new DataObject(prompts); 
newObject.SetData(myString); 
Clipboard.SetDataObject(newObject); 

đâu prompts là một bộ sưu tập List<Data.Sources.PromptResult>.

Sao chép tắt clipboard:

IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject(); 
if (dataObject.GetDataPresent(typeof(List<Data.Sources.PromptResult>))) 
{ 
    Type type = typeof(List<Data.Sources.PromptResult>); 
    Object obj = dataObject.GetData(type); 
    return (List<Data.Sources.PromptResult>)dataObject.GetData(type); 
} 

Các GetFormats() cho thấy định dạng như là trong danh sách và các GetDataPresent(List<Data.Sources.PromptResult>) trả về true nhưng nếu tôi cố gắng để có được những đối tượng ra khỏi lớp Clipboard với GetData(List<Data.Sources.PromptResult>) tôi nhận được sự trở lại của vô giá trị.

Có ai có bất kỳ ý tưởng nào có thể sai không?

+1

Tôi chạy vào những vấn đề tương tự, nhưng tôi giải quyết nó một cách khác. Tất cả những gì tôi phải làm là đảm bảo ** mọi phần của đối tượng của tôi ** (subobjects) là một kiểu có thể tuần tự hóa. Ít mã hơn. Hãy thử phương pháp [IsSerializable] (http://www.codeproject.com/Articles/8102/Saving-and-obtaining-custom-objects-to-from-Window)! Nếu lớp của bạn không phải là serializable ngoại lệ mô tả vấn đề khá tốt. – Bitterblue

Trả lời

11

OK tôi đã cố gắng để thêm danh sách các loại người dùng của tôi vào clipboard và làm cho nó trở lại ... Đây là những gì tôi đã cố gắng:

My tài Class:

public class User 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

Phần còn lại của Code:

// Create User list and add some users 
List<User> users = new List<User>(); 
users.Add(new User { age = 15, name = "Peter" }); 
users.Add(new User { age = 14, name = "John" }); 

// Lets say its my data format 
string format = "MyUserList"; 
Clipboard.Clear(); 

// Set data to clipboard 
Clipboard.SetData(format, users); 

// Get data from clipboard 
List<User> result = null; 
if (Clipboard.ContainsData(format)) 
    result = (List<User>)Clipboard.GetData(format); 

... và kết quả là null :) ... cho đến khi tôi đánh dấu User lớp như Serializable

[Serializable] 
public class User 
{ 
    //... 
} 

Sau đó mã của tôi hoạt động. Ok nó không phải là câu trả lời nhưng có lẽ nó sẽ giúp bạn một số cách.

+0

Có, serializable để tuần tự hóa lớp. Tôi sử dụng serialization XML bình thường nhưng tôi đoán lớp Clipboard sử dụng serialization nhị phân. – James

+1

Có sử dụng tuần tự nhị phân. – Reniuz

+0

Tôi đã có một trò chơi xung quanh với điều này và nó dường như làm việc ngoại trừ việc tôi đang cố gắng để cung cấp một đầu ra văn bản quá. Tôi nghĩ rằng tôi có thể phải thực hiện IDataObject trên lớp của riêng tôi. Tôi nghĩ rằng điều này bởi vì nếu tôi đặt DataObject với cả hai đối tượng serialized của tôi và một chuỗi văn bản sau đó đối tượng của tôi bị mất khi cố gắng để có được dữ liệu trở lại. Tôi nghĩ rằng nó có thể là một lỗi trong phương pháp SetData của DataObject. - Hoặc có sẵn lớp DataObject không thể tuần tự hóa được. – James

3

Tôi đã có một kịch bản tương tự và sau khi đánh dấu lớp của mình là có thể tuần tự hóa, tôi đã làm cho nó hoạt động.

Vì vậy, hãy thử đặt thuộc tính Serializable trên lớp của bạn Data.Sources.PromptResult.

4

@Reniuz cảm ơn sự giúp đỡ của bạn, nó đã giúp tôi tìm ra câu trả lời.

Để lấy dữ liệu văn bản và đối tượng tùy chỉnh ra khỏi Clipboard với nhiều định dạng, tôi đã triển khai giao diện IDataObject trong lớp của riêng mình. Các mã để thiết lập các đối tượng dữ liệu phải có cờ sao chép thiết lập như thế này:

Clipboard.Clear(); 
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true); 

Để có được dữ liệu ra một lần nữa các văn bản tiêu chuẩn có thể được lấy ra sử dụng:

Clipboard.GetText(); 

các dữ liệu có thể được lấy ra sử dụng phương pháp dữ liệu:

Clipboard.GetData("name of my class"); 

Điểm khác hữu ích là kiểm tra đối tượng tôi đưa vào khay nhớ tạm có thể được tuần tự bằng cách sử dụng lớp BinaryFormatter để thực hiện kiểm tra này. .. Nếu một ngoại lệ được ném mà sao chép vào clipboard cũng sẽ thất bại, nhưng âm thầm.

Vì vậy, lớp học của tôi có:

[Serializable] 
public class ClipboardPromptsHolder : IDataObject 
{ 
    ... 
} 
Các vấn đề liên quan