Pergunta

Essa questão está perto do que estou interessado, mas não exatamente.

Eu tenho um aplicativo .NET WinForms escrito em C#. eu tenho um ListView Controle que exibe uma matriz de objetos C#. Eu o conectei para que você possa arrastar/soltar esses itens da ListView para um formulário diferente no mesmo aplicativo, e ele passa corretamente a matriz de objetos (tipo Session) para o manipulador de gota para essa outra forma.

No entanto, agora quero oferecer suporte a arrastar/soltar de processo cruzado, onde executo várias instâncias do meu aplicativo. este parece que vai funcionar (por exemplo GetDataPresent é bem-sucedido), mas, em última análise object[] para Session[].

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

Alguém sabe se eu devo implemento ISerializable Para meus objetos para fazer isso funcionar? Normalmente, eu simplesmente tentaria, mas implementando ISerializable Pois esta aula seria bastante não trivial, e estou preocupado que possa haver efeitos colaterais estranhos de fazê-lo.


ATUALIZAR: Implementação ISerializable Não ajuda- o método nunca é chamado. Da mesma forma, adicionando o Serializable atributo à classe não tem impacto. Alguma outra idéia?

Foi útil?

Solução

Você está cruzando um limite de processo, as referências de objetos não são válidas em outro processo. A classe DataObject suporta objetos serializados para colocá -los através da parede, usa o BinaryFormatter. Então, sim, você precisará aplicar o atributo [serializável] à sua classe e garantir que seus objetos possam serializar corretamente.

Outras dicas

Ok, isso é uma foto, em vez de usar uma variedade de sessões, tente fazer isso individualmente assim ...

   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 a pena um tiro, além de me atirar no pé, pois não entendo completamente a parte da sessão, tente ...

Espero que isso ajude, cumprimentos, Tom.

Você pode usar "como" para o elenco, que evitará a exceção ("como" retornará "nulo" sem jogar uma exceção se o elenco falhar) - mas não acho que isso resolva seu problema (ele apenas evitará o real exceção), como eu concordo, é provável que você tenha que tornar sua classe serializável. Você pode testar sua hipótese comentando os campos que serão mais difíceis de fazê -lo funcionar - só por enquanto testá -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top