Cross-Process Drag and Drop di tipo di oggetto personalizzato in WinForms C #
-
21-09-2019 - |
Domanda
Questa domanda è vicino a quello che mi interessa , ma non del tutto.
Ho un'applicazione .NET WinForms scritto in C #. Ho un controllo ListView
che mostra una matrice di oggetti C #. Ho agganciato in modo che è possibile trascinare / rilasciare questi elementi ListView ad una forma diversa nella stessa applicazione, e passa correttamente l'array di oggetti (tipo Session
) al gestore goccia per quella altra forma.
Tuttavia, ora voglio sostenere cross-process drag / drop dove corro più istanze di mia applicazione. Questo appare che sta andando a lavorare (per esempio GetDataPresent
riesce), ma alla fine genera un'eccezione quando in realtà tenta di recuperare il data-- non può lanciare object[]
a Session[]
.
if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
Session[] oDroppedSessions;
try
{
oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
}
catch (Exception eX)
{ // reaches here
}
}
Qualcuno sa se I deve implementare ISerializable
per i miei oggetti al fine di fare questo lavoro? Di solito, mi piacerebbe semplicemente provato, ma attuare ISerializable
per questa classe sarebbe del tutto non banale, e io sono preoccupato che ci possono essere strani effetti collaterali di farlo.
Aggiorna : implementazione ISerializable
non help-- il metodo non viene mai chiamato. Allo stesso modo, aggiungendo l'attributo Serializable
alla classe non ha alcun impatto a tutti. Tutte le altre idee?
Soluzione
Si sta attraversando un confine processo, riferimenti a oggetti non sono validi in un altro processo. La classe DataObject supporta serializzazione di oggetti per farli attraverso la parete, utilizza BinaryFormatter. Quindi, sì, è necessario applicare l'attributo [Serializable] per la vostra classe e assicurarsi che gli oggetti possono DE / serializzare correttamente.
Altri suggerimenti
Ok questo è un colpo, invece di utilizzare tutta una serie di sessioni, provare a farlo individualmente come questo ...
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 }
Vale la pena un colpo, diverso da me la zappa sui piedi, come non capisco completamente la parte di sessione, provare ...
Spero che questo aiuti, I migliori saluti, Tom.
Si potrebbe usare "come" per la colata che eviterà l'eccezione ( "come" restituirà "null", senza un'eccezione se il cast non riesce) - ma non credo che questo risolverà il vostro problema (lo farà solo evitare l'eccezione reale), come sono d'accordo è probabile che dovrete fare la vostra classe Serializable. Si potrebbe verificare la vostra ipotesi commentando i campi che sarà più difficile per farlo funzionare -. Solo per ora di provarlo