Clipboard.ContainsData и Clipboard.GetData - PullRequest
       15

Clipboard.ContainsData и Clipboard.GetData

2 голосов
/ 15 декабря 2011

Я пытаюсь вставить некоторые скопированные объекты, используя класс буфера обмена.

  <Serializable()> Public Class DogsZoo
    Public Property Dogs As List(Of Dog)
    Public Property Workers As List(Of Worker)

    Public Sub New(dogs As List(Of Dog), workers As List(Of Worker))
      Me.Dogs = dogs
      Me.Workers = workers
    End Sub
  End Class

Dim myDogsZoo = myCity.GetDogsZoo()
Clipboard.SetData("dogs", myDogsZoo)

' bla bla , some actions '

If Not Clipboard.ContainsData("dogs") Then Throw New Exception("Clipboard")

' here I obtain Nothing !?'
Dim clipboardObject = Clipboard.GetData("dogs")

Проверка Clipboard.ContainsData (myFormat) проходит успешно, но когда я пытаюсь получить данные, я получаю нулевое значение (Nothing). Это правильное поведение?

PS.
C # или VB.NET ответы оба в порядке.

PPS.
Я должен признать, что я использовал вышеописанный метод без каких-либо проблем с буфером обмена, когда типы данных просты (общий список). Теперь я изменил объект для хранения в памяти на пользовательский ... и с того времени ... эта проблема ...

Ответы [ 3 ]

0 голосов
/ 16 декабря 2011

Будьте осторожны, чтобы классы "Dog" и "Worker" были сериализуемы ...

Копируемый объект должен быть сериализуемым, то есть, по крайней мере, все его открытые члены должны быть сериализуемыми.

Если нет, операция с буфером обмена завершается неудачно.

Кроме того, поток, который получает доступ к буферу обмена, должен иметь атрибут STA ...

0 голосов
/ 19 мая 2014

Я знаю, что это действительно старая публикация, но поскольку у нее нет решения, я думал, что смогу ее найти (мое первоначальное исследование привело меня сюда, но я наткнулся на причину проблемы в другом месте).Чтобы у моего объекта возникла та же проблема, описанная в этом потоке, я должен был убедиться, что он содержит конструктор с двумя параметрами, как показано ниже.После реализации вставка работала отлично.

Private Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
  With info
    Me.Key = .GetString("Key")
    Me.Description = .GetString("Description")
    ' etc.
  End With
End Sub

Очевидно, что код в блоке With - End With будет привязан к свойствам вашего собственного пользовательского объекта.

0 голосов
/ 16 декабря 2011

Если вы используете пользовательский объект, я считаю, что этот объект должен поддерживать сериализацию.

Мне показалась полезной следующая статья, когда я изучал чтение изображений и текста из буфера обмена: http://msdn.microsoft.com/en-us/library/637ys738.aspx

Есть раздел о записи данных в буфер обмена в произвольном формате.Я заметил ваш код на VB.net, поэтому я скопировал экстракт VB.net следующим образом:

'Демонстрирует SetData, ContainsData и GetData' с использованием имени произвольного формата и бизнес-объекта.Открытое свойство ReadOnly TestCustomFormat () как клиент получает Clipboard.SetData ("CustomerFormat", новый клиент ("имя клиента"))

    If Clipboard.ContainsData("CustomerFormat") Then
        Return CType(Clipboard.GetData("CustomerFormat"), Customer)
    End If

    Return Nothing
End Get End Property

...

Открытый класс Customer

Private nameValue As String = String.Empty

Public Sub New(ByVal name As String)
    nameValue = name
End Sub

Public Property Name() As String
    Get
        Return nameValue
    End Get
    Set(ByVal value As String)
        nameValue = value
    End Set
End Property

Конечный класс

Надеюсь, это поможет?

С уважением, Уэйн

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