2012-01-27 16 views
8

Próbuję skopiować obiekt do schowka Windows i wyłączyć ponownie. Mój kod jest tak:Schowek Kopiowanie obiektów do iz

Kopiuj do schowka:

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

Gdzie prompts jest List<Data.Sources.PromptResult> kolekcja.

Kopiowanie wyłączone Schowek:

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); 
} 

GetFormats() przedstawia format jako na liście i GetDataPresent(List<Data.Sources.PromptResult>) powraca prawda, ale gdy próbuję uzyskać obiekt z klasy Clipboard z GetData(List<Data.Sources.PromptResult>) mogę dostać zwrot zero.

Czy ktoś ma pojęcie, co może być nie tak?

+1

wpadłem na te same problemy, ale rozwiązał to inaczej. Jedyne, co musiałem zrobić, to upewnić się, że ** każda część mojego obiektu ** (podobiekty) była typu serializowalnego. Mniej kodu zdecydowanie. Wypróbuj metodę [IsSerializable] (http://www.codeproject.com/Articles/8102/Saving-and-obtaining-custom-objects-to-from-Window)! Jeśli twoja klasa nie nadaje się do serializacji, wyjątek opisuje problem całkiem nieźle. – Bitterblue

Odpowiedz

11

OK próbowałem do listy dodać mojego typu użytkownika do schowka i dostać go z powrotem ... Oto, co starałem:

Moja Klasa użytkownika:

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

Rest of 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); 

... i wynik był null :) ... dopóki nie oznaczony User klasy jako Serializable

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

Po tym czasie mój kod zadziałał. Ok to nie jest odpowiedź, ale może pomoże ci to jak.

+0

Czy tak, można serializować, aby dokonać serializacji klasy. Zazwyczaj korzystam z serializacji XML, ale domyślam się, że klasa Clipboard używa serializacji binarnej. – James

+1

Tak, używa serializacji binarnej. – Reniuz

+0

Mam zabawy z tym i wydaje się, że działa, z wyjątkiem, że próbuję zapewnić również wyjście tekstowe. Myślę, że być może będę musiał wdrożyć IDataObject na mojej własnej klasie. Myślę, że jeśli ustawię obiekt DataObject zarówno z serializowanym obiektem, jak i ciągiem tekstowym, to mój obiekt zostanie utracony podczas próby odzyskania danych. Myślę, że może to być błąd w metodzie SetData obiektu DataObject. - Lub prawdopodobnie klasa DataObject nie jest możliwa do serializacji. – James

3

Miałem podobny scenariusz i po zaznaczeniu mojej klasy jako serializowanej, udało mi się ją uruchomić.

Spróbuj umieścić atrybut Serializable w klasie Data.Sources.PromptResult.

4

@ Dziękuję za pomoc, która pomogła mi znaleźć odpowiedź.

Aby uzyskać tekst i niestandardowe dane obiektów ze Schowka w wielu formatach, zaimplementowałem interfejs IDataObject w mojej własnej klasie. Kod ustawić obiekt danych musi mieć flagę kopiowania ustawiony tak:

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

aby uzyskać dane ponownie standardowy tekst można odczytać za pomocą:

Clipboard.GetText(); 

The można pobrać przy użyciu danych metoda dane:

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

drugi punkt, który był pomocny, było sprawdzenie, że obiekt chowałem w schowku może być szeregowane za pomocą klasy BinaryFormatter aby wykonać ten test. .. Jeśli zostanie zgłoszony wyjątek, kopiowanie do schowka również zakończy się niepowodzeniem, ale bezgłośnie.

Więc moja klasa ma:

[Serializable] 
public class ClipboardPromptsHolder : IDataObject 
{ 
    ... 
}