Буфер обмена Копирование объектов в и из - PullRequest
11 голосов
/ 27 января 2012

Я пытаюсь скопировать объект в буфер обмена 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>), я получаю возвращаемый ноль. *

Кто-нибудь знает, что может быть не так?

Ответы [ 3 ]

15 голосов
/ 27 января 2012

ОК. Я попытался добавить список моего типа пользователя в буфер обмена и вернуть его обратно ... Вот что я попробовал:

Мой класс пользователя:

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
{ 
    //...   
}

После этого мой код заработал. Хорошо, это не ответ, но, возможно, это поможет вам как-то.

4 голосов
/ 30 января 2012

@ Reniuz спасибо за вашу помощь, она помогла мне выработать ответ.

Чтобы получить текст и данные пользовательских объектов из буфера обмена в нескольких форматах, я реализовал интерфейс IDataObject в своем собственном классе. Код для установки объекта данных должен иметь установленный флаг копирования следующим образом:

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

Для повторного получения данных стандартный текст можно получить с помощью:

Clipboard.GetText();

Данные могут быть получены с использованием метода данных:

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

Другой полезный момент состоял в том, чтобы проверить, что объект, который я помещаю в буфер обмена, может быть сериализован с использованием класса BinaryFormatter для выполнения этого теста ... Если выдается исключение, копирование в буфер обмена также завершится неудачно, но молча.

Итак, у меня в классе:

[Serializable]
public class ClipboardPromptsHolder : IDataObject
{
    ...
}
3 голосов
/ 27 января 2012

У меня был похожий сценарий, и после обозначения моего класса как сериализуемого я заставил его работать.

Поэтому попробуйте добавить атрибут Serializable в свой класс Data.Sources.PromptResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...