Arrastar-se e gota de processo de processo personalizado no winforms c#
-
21-09-2019 - |
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?
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.