2012-01-27 21 views
8

Estoy intentando copiar un objeto en el portapapeles de Windows y desactivarlo nuevamente. Mi código es así:Portapapeles Copiar objetos ay desde

Copiar en el portapapeles:

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

Dónde prompts es una colección List<Data.Sources.PromptResult>.

copia Off portapapeles:

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

El GetFormats() muestra el formato que estar en la lista y los GetDataPresent(List<Data.Sources.PromptResult>) rendimientos cierto, pero si trato de sacar el objeto de la clase Clipboard con GetData(List<Data.Sources.PromptResult>) puedo obtener un retorno de nulo.

¿Alguien tiene alguna idea de lo que podría estar mal?

+1

me encontré con los mismos problemas, pero lo resolví de manera diferente. Todo lo que tenía que hacer era asegurarme de ** cada parte de mi objeto ** (subobjetos) era de tipo serializable. Menos código por ahora. Pruebe el [método IsSerializable] (http://www.codeproject.com/Articles/8102/Saving-and-obtaining-custom-objects-to-from-Window)! Si su clase no es serializable, la excepción describe el problema bastante bien. – Bitterblue

Respuesta

11

Aceptar He intentado añadir mi lista de tipo de usuario al portapapeles y recuperarlo ... Aquí es lo que he intentado:

Mi clase de usuario:

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

Resto Código:

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

... y el resultado fue null :) ... hasta he marcado User clase como Serializable

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

Después de eso mi código funcionó. Bueno, no es la respuesta, pero tal vez te ayude de alguna manera.

+0

Sí, serializable para serializar la clase. Utilizo la serialización XML normalmente, pero supongo que la clase Clipboard utiliza la serialización binaria. – James

+1

Sí, usa serialización binaria. – Reniuz

+0

He tenido un juego con esto y parece funcionar, excepto que estoy tratando de proporcionar una salida de texto también. Creo que debo implementar el IDataObject en mi propia clase. Creo que esto porque si configuro DataObject con mi objeto serializado y una cadena de texto, entonces mi objeto se pierde cuando intento recuperar los datos. Creo que puede ser un error en el método SetData del DataObject. - O quizás la clase DataObject no es serializable. – James

3

Tuve un escenario similar y después de marcar mi clase como serializable lo hice funcionar.

Así que intente poner el atributo Serializable en su clase Data.Sources.PromptResult.

4

@Reniuz gracias por su ayuda, me ha ayudado a encontrar la respuesta.

Para obtener el texto y los datos de objetos personalizados fuera del Portapapeles con múltiples formatos he implementado la interfaz IDataObject en mi propia clase. El código para establecer el objeto de datos debe tener la bandera juego de copias de esta manera:

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

Para obtener los datos de nuevo el texto estándar puede ser recuperada usando:

Clipboard.GetText(); 

Los datos pueden ser recuperados utilizando el método de datos:

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

el otro punto que era útil era probar que el objeto que estaba poniendo en el portapapeles podría ser serializado utilizando la clase BinaryFormatter para realizar esta prueba. .. Si se produce una excepción, la copia en el portapapeles también fallaría, pero en silencio.

Así que mi clase tiene:

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