OVH Cloud OVH Cloud

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
ftrl
Pierre Y. a écrit :

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 ?



Alors là, je ne saurais te dire. Je ne me suis servi réellement du
binding qu'avec la v2.

Jean
Avatar
Pierre Y.
ftrl a écrit :
Pierre Y. a écrit :

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 ?



Alors là, je ne saurais te dire. Je ne me suis servi réellement du binding
qu'avec la v2.



C'est vachement fort en tous les cas, avec les generics, je remplace
mon DatabaseCollection (voir quelques messages plus haut) par :

public class DatabaseCollection
{
public List<Database> Databases;
}

Et les boutons "Add New" et "Delete" sont actifs dans le
BindingNavigator, du coup le code "à écrire" de la fenêtre se résume à
:

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

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

DatabaseBindingSource.DataSource = dc.Databases;
}
}

private void bindingNavigatorSave_Click(object sender, EventArgs e)
{
XmlTextWriter xtw = new XmlTextWriter("Clients.xml", Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xtw.Indentation = 4;

XmlSerializer xs = new XmlSerializer(typeof(DatabaseCollection));
xs.Serialize(xtw, dc);

xtw.Close();
}

// Concession à la modernité, il faut quand même dire quel controle
// sera activé lorsqu'une nouvelle "Database" est ajoutée à la liste
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs
e)
{
textBox1.Focus();
}

En tous les cas merci, je vais retourner à mon .NET 1.1 pour tenter de
comprendre ce qui ne marche pas avec mon DataBinding.

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 :

C'est vachement fort en tous les cas, avec les generics, je remplace mon
DatabaseCollection (voir quelques messages plus haut) par :



Si ça se trouve, certains delphinautes vont comprendre qu'ils ont
exactement 14 ans de retard (en c++, les templates, ça remonte à 91 je
crois) !

Jean
Avatar
Pierre Y.
ftrl a écrit :
Pierre Y. a écrit :

C'est vachement fort en tous les cas, avec les generics, je remplace mon
DatabaseCollection (voir quelques messages plus haut) par :



Si ça se trouve, certains delphinautes vont comprendre qu'ils ont exactement
14 ans de retard (en c++, les templates, ça remonte à 91 je crois) !



Ca va venir à coup de VS2005 + Chrome ?

;-)

Pierre

PS : Alors finalement ftrl c'est toi...

--
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
Merlin
ftrl a écrit :
Si ça se trouve, certains delphinautes vont comprendre qu'ils ont exactement
14 ans de retard (en c++, les templates, ça remonte à 91 je crois) !



c'est vrai que c'est une vieille idée. Mais on peut dire que malgré
tout elle ne prend tout son sens que dans un environnement totalement
objet comme .NET. Pour faire de l'interface Windows avec les MFC ou la
VCL c'était pas indispensable. Là ça devient très intéressant car y'a
tout qui suit.
Et puis, on pourrait dire aussi que les développeurs C++ vont
comprendre qu'ils ont bien dix ans de retard car ça fait depuis Delphi
1 que la notion de property existe...
Tout cela ne serait que mesquinerie non ? :-)

--

///3rL1n________
www.e-naxos.com
gratuit section "Delphi Stargate"
Avatar
Michael Moreno
Oui mais alors le C++, excuse-moi mais pour faire des ecrans... du
COM... etc, c'est vraiment galere ! C# est un super compromis.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Michael Moreno
> PS : Alors finalement ftrl c'est toi...



C'est Jean L*****te non ?

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Michael Moreno
> de property existe...



Il est possible de faire des property en C++ en utilisant les
operateurs.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
ftrl
Merlin a écrit :
Si ça se trouve, certains delphinautes vont comprendre qu'ils ont
exactement 14 ans de retard (en c++, les templates, ça remonte à 91 je
crois) !




c'est vrai que c'est une vieille idée. Mais on peut dire que malgré tout
elle ne prend tout son sens que dans un environnement totalement objet
comme .NET.



Rires.

Pour faire de l'interface Windows avec les MFC ou la VCL
c'était pas indispensable. Là ça devient très intéressant car y'a tout
qui suit.



Par définition, les templates sont en dehors du modèle objet en c++ ! Le
paradigme "généricité" est totalement indépendant du paradigme "objet".
Ca t'a échappé on dirait.

Et puis, on pourrait dire aussi que les développeurs C++ vont comprendre
qu'ils ont bien dix ans de retard car ça fait depuis Delphi 1 que la
notion de property existe...



Dans tes rêves !

Tout cela ne serait que mesquinerie non ? :-)



Et nous ne sommes pas au meilleur endroit pour que tu apprennes quelques
notions importantes sur les langages, domaine dans lequel tu as de
nombreuses lacunes.

Jean
Avatar
ftrl
Michael Moreno a écrit :
Oui mais alors le C++, excuse-moi mais pour faire des ecrans... du
COM... etc, c'est vraiment galere ! C# est un super compromis.



Je ne dis pas le contraire, au contraire !

Mais c'est essentiellement une notion d'Edi et d'api que c++ est chiant
à utiliser pour les écrans.

Pour com, non, je ne trouve pas.

Jean
1 2 3