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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top