Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Forcer la mise à jour d'un Label lié à un objet

22 réponses
Avatar
Pierre Y.
Bonjour,

Le titre n'est pas clair... Pas facile de trouver une phrase courte qui
explique ce dont j'ai besoin.

Alors voilà, j'ai ces objets là :

namespace Pierre
{
public class Database
{
public string Name;
public string Host;
public string Path;
public string Username;
public string Password;

public string ConnectionString {
get { return @"Database=" + Host + ":" + Path + ";Userna...";}
}
}

public class DatabaseCollection
{
public Database[] Databases;
}
}

Avec quelques attributs qui permettent de désérialiser le tout d'un
fichier XML comme celui là :

<?xml version="1.0"?>
<config xmlns="http://www.levosgien.net/Test/2005/08">
<database name="UnNom">
<host>LOCALHOST</host>
<path>D:\Databases\Test.fdb</path>
<user>SYSDBA</user>
<password>masterkey</password>
</database>
</config>

Donc au chargement de l'application, je désérialise le fichier dans une
DatabaseCollection et je *Bind* les propriétés des *Database* sur les
contrôles de la fenêtre.

Une combobox dans laquelle il y a la liste des *Database.Name* de
manière à pouvoir choisir une config dans la liste de celles lues dans
le fichier xml.

4 TextBox liées aux champ de la *Database* en cours.

1 Label qui affiche la ConnexionString de la *Database* en cours.

private void WinForm_Load(object sender, System.EventArgs e)
{
if (File.Exists("Config.xml"))
{
XmlTextReader xtr = new XmlTextReader("Config.xml");
XmlSerializer xs = new XmlSerializer(typeof(DatabaseCollection));

dc = (DatabaseCollection)xs.Deserialize(xtr);

cbConfigs.DataSource = dc.Databases;
cbConfigs.ValueMember = "Name";
cbConfigs.DisplayMember = "Name";

edHost.DataBindings.Add("Text",dc.Databases,"Host");
edPath.DataBindings.Add("Text",dc.Databases,"Path");
edUserName.DataBindings.Add("Text",dc.Databases,"Username");
edPassword.DataBindings.Add("Text",dc.Databases,"Password");

lbConnStr.DataBindings.Add("Text",dc.Databases,"ConnectionString");
}
}

Au chargment tout va pour le mieux, j'ai la liste de mes
*Database.Name* dans la combobox, quand je change la sélection, les
propriétés de la nouvelle *Database* sont affichées dans les contrôles
de la fenêtre.

Mon problème c'est que lors de l'édition des propriétés de la
*Database* courante, le Label lbConnStr qui contient la
ConnectionString calculée d'après les propriétés de la *Database* n'est
pas mis à jour.

Comment forcer la mise à jour du contenu de ce Label ?

Merci d'avance,

Pierre Y.

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."

10 réponses

1 2 3
Avatar
Michael Moreno
> Mon problème c'est que lors de l'édition des propriétés de la *Database*
courante, le Label lbConnStr qui contient la ConnectionString calculée
d'après les propriétés de la *Database* n'est pas mis à jour.

Comment forcer la mise à jour du contenu de ce Label ?



Je ne suis pas sur d'avoir tout saisi.

Pourquoi ne peux-tu pas utiliser les evenements de l'interface
graphique ou bien mettre les champs de la classe Database dans des
property avec un evenement du genre onNewConnString lance a chaque fois
que l'un des champs est modifie ?

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Francois Muller
"Pierre Y." <pierre@[levosgien].net> a écrit dans le message de news:
Le titre n'est pas clair... Pas facile de trouver une phrase courte qui
explique ce dont j'ai besoin.



Désolé, mais je crois n'avoir rien compris

F.
Avatar
ftrl
Pierre Y. a écrit :

Comment forcer la mise à jour du contenu de ce Label ?



J'ai un truc similaire et je n'ai pas rencontré de problème (le champ
"virtuel" est mis à jour correctement).

En revanche, j'accède aux membres de l'objet par des propriétés (je ne
savais même pas qu'on pouvait faire autrement, j'utilise l'assistant qui
crée les datasources à partir d'un objet), je ne sais pas si ça a une
importance.

Jean
Avatar
Pierre Y.
Michael Moreno a écrit :
Pourquoi ne peux-tu pas utiliser les evenements de l'interface graphique ou
bien mettre les champs de la classe Database dans des property avec un
evenement du genre onNewConnString lance a chaque fois que l'un des champs
est modifie ?



Tu as bien compris que j'essayais de travailler sur un "cas d'école",
si j'ai bien suivi, le DataBinding, les BindingManager et le reste
c'est l'implémentation du pattern observer ?

Bien sur que je peux travailler sur les évènements de l'interface
graphique, mais pour ce que je veux faire ça donne ça :

edHost.TextChanged += new System.EventHandler(configEdits_TextChanged);
edPath.TextChanged += new System.EventHandler(configEdits_TextChanged);
edUserName.TextChanged += new
System.EventHandler(configEdits_TextChanged);
edPassword.TextChanged += new
System.EventHandler(configEdits_TextChanged);

private void configEdits_TextChanged(object sender, System.EventArgs e)
{
Database d = new Database();
d.Host = edHost.Text;
d.Path = edPath.Text;
d.Username = edUserName.Text;
d.Password = edPassword.Text;

lbConnStr.Text = d.ConnectionString;
}

Donc à chaque fois que je choisis un nouvel item dans la ComboBox, le
Label est redessiné 4 fois (puis ensuite à chaque fois que je modifie
le texte des TextBox)

Je cherche seulement à utiliser correctement les outils que .NET met à
ma disposition.

Si j'utilisais un Dataset tout irait beaucoup mieux :
- Ca lirait les données depuis le fichier XML et le DataBinding est
vraiment "two-way" puisque le DataBinding implémente un CurrencyManager
plutôt qu'un PropertyManager.

Je n'aurais eu qu'à considérer ConnectionString comme un champ calculé
de la DataTable et je pense que le Label aurait été redessiné
correctement à chaque modification d'une des autres colonnes de la
table.

Mais c'est beaucoup moins rigolo :-)

A+

Pierre

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."
Avatar
Pierre Y.
Francois Muller a écrit :
"Pierre Y." <pierre@[levosgien].net> a écrit dans le message de news:
Le titre n'est pas clair... Pas facile de trouver une phrase courte qui
explique ce dont j'ai besoin.



Désolé, mais je crois n'avoir rien compris



Qu'est-ce qu'il faut que je réexplique ?

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."
Avatar
Pierre Y.
> En revanche, j'accède aux membres de l'objet par des propriétés (je ne savais
même pas qu'on pouvait faire autrement, j'utilise l'assistant qui crée les
datasources à partir d'un objet), je ne sais pas si ça a une importance.



J'ai l'impression que c'est ce que je fais, j'accède aux membres de
l'objet par des propriétés (en vrai, mais c'est plus simple dans un
exemple aussi bateau de dire que tous les membres sont public).

Par contre je ne connais pas cet assistant qui crée les datasources à
partir d'un objet, peut-être que ca fait les choses différemment, où je
peux le trouver ?

Merci et A+

Pierre

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."
Avatar
ftrl
Pierre Y. a écrit :
Par contre je ne connais pas cet assistant qui crée les datasources à
partir d'un objet, peut-être que ca fait les choses différemment, où je
peux le trouver ?



C'est avec 2005 (j'aurais dû préciser).
Menu Data, commande Add new Data Source... puis tu choisis Object.

Jean
Avatar
Pierre Y.
ftrl a écrit :
Pierre Y. a écrit :
Par contre je ne connais pas cet assistant qui crée les datasources à
partir d'un objet, peut-être que ca fait les choses différemment, où je
peux le trouver ?



C'est avec 2005 (j'aurais dû préciser).
Menu Data, commande Add new Data Source... puis tu choisis Object.



OK, j'ai trouvé, mais ca ne fait rien du tout à par me génerer un
fichier XML, quand j'essaye ensuite d'utiliser cette Datasource, je ne
vois aucun membre de mon objet auquel me lier. Il y a quelque chose de
particulier à faire ?

Merci ;-)

A+

Pierre

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."
Avatar
ftrl
Pierre Y. a écrit :

OK, j'ai trouvé, mais ca ne fait rien du tout à par me génerer un
fichier XML, quand j'essaye ensuite d'utiliser cette Datasource, je ne
vois aucun membre de mon objet auquel me lier. Il y a quelque chose de
particulier à faire ?



Ben non. Tu ajoute un binding source à ta form ou même mieux, tu peux
faire drag and drop des champs du data source (en choisissant le type de
champ, label, edit, etc.) vers la form.

Et comme je te disais, il me montre tous les membres publics qui sont
des propriétés.

Jean
Avatar
Pierre Y.
> Et comme je te disais, il me montre tous les membres publics qui sont des
propriétés.



Ouaip, c'était là le problème, j'avais laissé mes membres publics tel
quels. Avec des propriétés c'est mieux ;-)

Et effectivement, le Label est rafraîchi correctement... Est-ce que ca
vient de .NET 2.0 dont le fonctionnement des DataBindings aurait été
amélioré ou j'ai loupé un truc dans mon implémentation avec le 1.1 ?

Merci encore, A+

Pierre

--
Pierre Y.
levosgien.net - http://cerbermail.com/?7dwZGWwOB0
(Cliquez sur le lien ci-dessus pour me contacter en privé)

Capitaine anglais : "Vous vous battez pour l'argent, nous on se bat
pour l'honneur !"
Robert Surcouf : "Vous avez raison, Monsieur, chacun de nous combat
pour ce qui lui manque."
1 2 3