Net Remoting et dataBinding
Bonjour
D’un côté j’ai une application serveur. Cette application a la définition d’une classe Contrôleur :
Code:
1 2 3 4 5
|
public class Controleur : MarshalByRefObject
{
public ChampsList listeDesChamps = new ChampsList(); |
Cette classe contient un membre ListeDesChamps de type ChampsList :
Code:
1 2 3
|
[Serializable]
public class ChampsList : CollectionBase, IBindingList |
Cette classe implémente IBindingList pour pouvoir servir de dataSource à un dataGridView sur le client.
Le serveur expose la classe Controleur :
Code:
1 2 3 4 5 6 7 8 9 10
|
HttpChannel MonCanal = new HttpChannel(65100);
ChannelServices.RegisterChannel(MonCanal);
// 2) Ce domaine d'application présente un objet de type
// Controlleur associé au point terminal 'Saisie'
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Controleur),
"Saisie",
WellKnownObjectMode.Singleton); |
De l’autre côté, le client, un application WinForm
Code:
1 2 3 4 5
|
public partial class Saisie : Form
{
HttpChannel MonCanal = new HttpChannel(0);
Controleur LeControleur; |
récupère le contrôleur dans un proxy transparent :
Code:
1 2 3 4 5 6 7 8 9 10
|
ChannelServices.RegisterChannel(MonCanal);
MarshalByRefObject Obj = (MarshalByRefObject)
RemotingServices.Connect(
typeof(Controleur),
"http://localhost:65100/Saisie");
LeControleur = Obj as Controleur;
// Appel d'une méthode sur l'objet distant
LeControleur.AfficheMessage(); |
Jusque là, cela fonctionne, la procédure AfficheMessage, par exemple, affiche un message sur la console du serveur.
J’affecte alors la DataSouce du dataGridView (local) à la propriété listeDesChamps du controleur (l'objet distant)
Code:
1 2
|
dataGridViewTest1.DataSource = LeControleur.listeDesChamps; |
puis j’affiche la fenêtre (en fait se fait dans le « load » de la fenêtre contenant le dataGridView).
Et là… Le DataGridView ne s’affiche pas correctement. Il ne se dessine même pas, à vrai dire, à son emplacement reste dessiné ce qu’il y avait à l’écran à ce moment-là. Si je clique sur les endroits où devraient se trouver les cellules, elles apparaissent. Les cellules contenant du texte l’affiche, les cellules contenant un bitmap n’affichent rien.
Mais cet affichage est instable : si je clique sur une autre cellule, la cellule dont le contenu venait de s’afficher ne s’affiche plus correctement. Un refresh sur le dataGridView ou sur la form ne change rien.
Si je crée la source de données en local, sur le client, cela marche correctement. C’est donc bien le fait que les données appartiennent à un objet distant qui pose problème.
Comme je débute avec le Net Remoting (et même avec le C#), je me pose des questions. Si je ne marque pas ChampsList, du coté serveur, comme [Serializable], j’ai une erreur à l’exécution. Mais si elle est sérialisable, est-ce que cela ne veut pas dire qu’elle passe par valeur, alors que l’objet Controleur est passé par référence ? Est-ce que ce n’est pas cela qui pose problème ?
De manière générale, si une classe descend de MarshalByRefObject, est-ce qu’il faut que tout ce qu’elle contient en descende aussi pour que cela soit passé par référence ?
Qu’est-ce qui peut clocher, dans mon appli ? Est-ce qu’il ne devrait pas être possible d’utiliser une collection d’objets comme dataSource d’un contrôle, avec Net Remoting ?
Merci de vos lumières !