Перекрестное перетаскивание пользовательских типов объектов в WinForms C # - PullRequest
7 голосов
/ 21 января 2010

Этот вопрос близок к тому, что мне интересно, но не совсем.

У меня есть приложение .NET WinForms, написанное на C #.У меня есть ListView элемент управления, который отображает массив объектов C #.Я подключил его, чтобы вы могли перетаскивать эти элементы списка в другую форму в одном приложении, и он правильно передает массив объектов (тип Session) в обработчик удаления для этой другой формы.

Однако теперь я хочу поддерживать межпроцессное перетаскивание, когда я запускаю несколько экземпляров своего приложения.Это кажется , что оно будет работать (например, GetDataPresent успешно), но в конечном итоге выдает исключение, когда я на самом деле пытаюсь получить данные - не может привести object[] к Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}

Кто-нибудь знает, должен ли я реализовать ISerializable для своих объектов, чтобы заставить эту работу?Обычно я просто пробовал бы это, но реализация ISerializable для этого класса была бы весьма нетривиальной, и я беспокоюсь, что это может иметь странные побочные эффекты.


ОБНОВЛЕНИЕ : Реализация ISerializable не помогает - метод никогда не вызывается.Точно так же добавление атрибута Serializable в класс никак не влияет.Есть еще идеи?

Ответы [ 3 ]

4 голосов
/ 21 января 2010

Вы пересекаете границу процесса, ссылки на объекты недопустимы в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы переместить их через стену, он использует BinaryFormatter. Итак, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут быть де-сериализованы правильно.

0 голосов
/ 21 января 2010

Хорошо, это снимок, вместо того, чтобы использовать целый массив сессий, попробуйте сделать это индивидуально, как это ...

   Session[] oDroppedSessions;
   try
   {
      if (e.Data.GetData("Fiddler.Session[]") != null){
          object[] objs = e.Data.GetData("Fiddler.Session[]");
          if (objs != null && objs.Length > 1){
             oDroppedSessions = new Session[objs.Length];
             int nIndex = 0;
             foreach(object obj in objs){
                if (obj is Session){
                  oDroppedSessions[nIndex] = (Session)obj;
                  nIndex++;
                }
             }
          }
      }
   }
   catch (Exception eX)
   {  // reaches here }

Стоит попробовать, кроме как выстрелить себе в ногу, так как я не до конца понимаю сессионную часть, попробуйте ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 21 января 2010

Вы можете использовать «как» для приведения, что позволит избежать исключения («as» вернет «ноль», не выбрасывая исключение в случае сбоя приведения) - но я не думаю, что это решит вашу проблему (это просто избегайте фактического исключения), поскольку я согласен, что вам, вероятно, придется сделать ваш класс сериализуемым. Вы можете проверить свою гипотезу, комментируя поля, которые будут сложнее заставить ее работать - только сейчас, чтобы проверить это.

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