Буфер обмена Копирование объектов в и из
Я пытаюсь скопировать объект в буфер обмена Windows и снова выключить. Мой код выглядит следующим образом:
Скопировать в буфер обмена:
Clipboard.Clear();
DataObject newObject = new DataObject(prompts);
newObject.SetData(myString);
Clipboard.SetDataObject(newObject);
Где prompts
- это коллекция List<Data.Sources.PromptResult>
.
Скопировать буфер обмена:
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()
показывает формат как находящийся в списке, а GetDataPresent(List<Data.Sources.PromptResult>)
возвращает true, но если я попытаюсь получить объект из класса Clipboard
с GetData(List<Data.Sources.PromptResult>)
, я получаю возврат null.
Кто-нибудь может понять, что может быть неправильным?
Ответы
Ответ 1
OK Я попытался добавить список своего типа пользователя в буфер обмена и вернуть его обратно...
Вот что я пробовал:
Мой пользовательский класс:
public class User
{
public int Age { get; set; }
public string Name { get; set; }
}
Остальная часть кода:
// 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);
... и результат был null
:)
... пока я не обозначил класс User
как Serializable
[Serializable]
public class User
{
//...
}
После этого мой код работал.
Хорошо, это не ответ, но, возможно, это поможет вам каким-то образом.
Ответ 2
@Reniuz благодарит за вашу помощь, это помогло мне выработать ответ.
Чтобы получить текст и данные пользовательских объектов из буфера обмена с несколькими форматами, я реализовал интерфейс IDataObject в своем классе. Код для установки объекта данных должен иметь флаг копирования, установленный следующим образом:
Clipboard.Clear();
Clipboard.SetDataObject(myClassThatImplementsIDataObject, true);
Чтобы получить данные снова, стандартный текст можно получить, используя:
Clipboard.GetText();
Данные могут быть получены с использованием метода данных:
Clipboard.GetData("name of my class");
Другой момент, который был полезен, заключался в том, чтобы проверить, что объект, который я помещал в буфер обмена, можно было сериализовать, используя класс BinaryFormatter для выполнения этого теста... Если возникает исключение, что копирование в буфер обмена также потерпит неудачу, но тихо.
Итак, у моего класса есть:
[Serializable]
public class ClipboardPromptsHolder : IDataObject
{
...
}
Ответ 3
У меня был похожий сценарий, и после маркировки моего класса как сериализуемого я получил его для работы.
Итак, попробуйте поместить атрибут Serializable в свой класс Data.Sources.PromptResult.
Ответ 4
Я обнаружил, что если ваш класс является производным от другого класса, необходимо также сделать базовый класс [Serializable], иначе этот рецепт не будет работать. В моем случае это было что-то вроде
public abstract class MyAbstractUser
{
...
}
[Serializable]
public class MyUser : MyAbstractUser
{
...
}
Когда я пытался обмениваться значениями MyUser через буфер обмена, он не работал, но когда я добавил [Serializable] в MyAbstractUser, он работал.