交叉处理拖动和自定义对象类型的掉落在的WinForms C#
-
21-09-2019 - |
题
这个问题是接近我很感兴趣,但并不完全。
我有C#编写的一个.NET WinForms应用程序。我有显示C#对象的阵列的ListView
控制。我已经钩住起来,这样就可以拖/放列表视图这些项在同一应用程序不同的形式,而且它适当地传送对象(类型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
属性类具有完全没有影响。任何其他的想法?
解决方案
您正在跨越进程边界,对象引用不是在另一个过程中有效。 DataObject类支持序列化对象在墙上,让他们,它使用的BinaryFormatter。所以,是的,你需要到[Serializable]属性应用到你的类,并确保你的对象可以去/连载正常。
其他提示
确定这是一个镜头,而是采用会话的整个阵列,尝试单独做这样的...
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 }
值得一试,比拍摄自己的脚,因为我不完全理解会议的部分外,试试吧...
希望这有助于 最好的祝福, 汤姆。
您可以使用“为”铸造这将避免异常(“为”将返回“空”,没有抛出,如果转换失败除外) - 但我不认为这将解决您的问题(它只是将避免实际的除外),因为我同意它很可能你就必须让你的类Serializable接口。您可以通过评论指出,将很难使其工作领域测试的假设 - 只是现在来测试它