Перекрестное перетаскивание пользовательского типа объектов в WinForms C#
этот вопрос - это близко к тому, что меня интересует, но не совсем.
у меня есть приложение .NET WinForms, написанное на C#. У меня есть ListView
control, который отображает массив объектов C#. Я подключил его, чтобы вы могли перетаскивать эти элементы listview в другую форму в том же приложении, и он правильно передает массив объектов (тип Session
) к обработчику drop для этой другой формы.
однако теперь я хочу поддержать межпроцессное перетаскивание, где я запускаю несколько экземпляров моего приложения. Это появляется что это будет работать (например,GetDataPresent
succeeds), но в конечном итоге выдает исключение, когда я на самом деле пытаюсь получить данные-не могу бросить 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 ответов
вы пересекаете границу процесса, ссылки на объекты недопустимы в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы получить их через стену, он использует BinaryFormatter. Итак, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут де/сериализоваться должным образом.
Ok это выстрел, вместо того, чтобы использовать весь массив сеансов, попробуйте сделать это индивидуально, как это...
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 }
стоит выстрелить, кроме как стрелять себе в ногу, поскольку я не полностью понимаю часть сеанса, попробуйте...
надеюсь, это поможет, С уважением, Том.
вы можете использовать " как " для кастинга, который избежит исключения ("как "вернет" null " без исключения, если приведение не удастся), но я не думаю, что это решит вашу проблему (это просто избежит фактического исключения), так как я согласен, что вам, вероятно, придется сделать ваш класс Сериализуемым. Вы можете проверить свою гипотезу, комментируя поля, которые будет сложнее заставить ее работать - только сейчас, чтобы проверить ее.