[.NET C#, DataTable] Modification d'une row et répercution graphique

Modification d'une row et répercution graphique [.NET C#, DataTable] - C#/.NET managed - Programmation

Marsh Posté le 11-12-2005 à 03:44:51    

Hello :)
 
J'ai un problème que je n'arrive pas vraiment à résoudre !
 
En fait j'ai 3 CheckedList, chacune bindée à une colonne d'une même DataTable. Dans cette table j'ai une 4ème colonne qui indique un état, en fait true ou false, pour savoir si la "ligne" est checkée ou non. Cette colonne n'est bindé à rien du tout.
 
Parfois, je dois mettre à jour cette dernière colonne. Pour cela :
view[num].Row[table.Columns.IndexOf("checked" )] = 1 ou 0;
 
Cette update ne doit rien changer dans mes CheckedLists car les informations qui s'y trouvent ne sont pas modifiés... et ce qui est étonnant, c'est que graphiquement quelquechose se passe, comme si les CheckedLists se mettaient à jour à nouveau !
 
Comment éviter cet effet dérangeant ? Avez-vous des idées ?
 
Merci :)

Reply

Marsh Posté le 11-12-2005 à 03:44:51   

Reply

Marsh Posté le 12-12-2005 à 16:19:34    

TigrouMeow a écrit :

Parfois, je dois mettre à jour cette dernière colonne. Pour cela :
view[num].Row[table.Columns.IndexOf("checked" )] = 1 ou 0;

Tu parles bien en C# ?
L'effet dérangeant c'est quoi, concrètement ? Paske là c un peu très flou :)
T'as pas un peu de code à nous montrer ?


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 13-12-2005 à 00:16:39    

Bon en fait maintenant j'ai trouvé une solution pour modifier que la colonne qui m'interresse, comme ceci :
view[num].Row[table.Columns.IndexOf("checked" )] = 1;
 
Ca change pas grand chose, j'ai toujours ce problème visuel ;) Je parle bien en C#... J'ai vraiment du mal à l'exprimer, et le code il y en a beaucoup, mais en gros le problème est cerné. J'ai un tableau (DataView en fait) de 3 colonnes, d'un autre côté j'ai 2 CheckedList, chacune bindé à une colonne du tableau. La 3ème colonne de mon tableau indique juste un état, checké ou non checké... Et en fait, manuellement, je vérifie à certain moment quel item des CheckedList doivent être checké, et je les check ou non...  
 
Le problème ne se situe pas à cet endroit là ! En fait, quand je clique pour coché un item sur mes CheckedList, il y a un appel à une de mes fonctions afin de renseigner ma table, et mettre à jour la fameuse colonne d'état du check... et quand je met à jour cette colonne dans la table, blam, les CheckedList partent en live, un effet graphique bizarre survient.
 
En fait, ce qui se passe, c'est que la checkedList, qui est bien remplie, remonte au tout début, et défile défile vers le bas jusqu'à arriver à l'élément qu'on a sélectionné. C'est très rapide, donc ça fait un effet bizarre et plutôt dérangeant. Surtout qu'en plus la position de l'item sélectionné (et coché au passage), change... bon j'ai pris des screenshots ça sera un peu plus évident à voir :
 
http://www.meow.fr/download/1.gif
http://www.meow.fr/download/2.gif
 
Voilà, je pense qu'il faudrait désactiver la mise à jour des checkedList qui sont associés à ce moment là, ou simplement qu'elles ne se mettent pas à jour si cette colonne est changée...  
 
Merci :)

Reply

Marsh Posté le 19-12-2005 à 11:29:26    

C'est du WinForm ?
T'as essayé SuspendLayout et ResumeLayout ?
Tu colles myCheckList.SuspendLayout() avant de la modifier, et myCheckList.ResumeLayout(false) après.
Ca peut éviter les effets bizarres après une simple modification.
Sinon, tu pourrais juste montrer le code que tu utilises pour modifier ta CheckList ? Y'a ptet un autre moyen qui ferait moins de vagues...


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 19-12-2005 à 14:31:08    

Bouh  
 
ça marche pas avec Suspend et Resume :(
 
En fait niveau code y'a pas grand chose, juste ça à un endroit :

Code :
  1. if (state == true)     
  2.   view[num].Row[table.Columns.IndexOf("checked" )] = 1;
  3. else
  4.   view[num].Row[table.Columns.IndexOf("checked" )] = 0;


Là, je modifie une ligne dans ma view. Le truc c'est que les ListBox sont rattachés à cette view, du coup elles sont toutes "rafraichies", alors qu'au niveau de l'affichage il n'y a rien qui change :(
 
Je viens d'essayer avec BeginUpdate et EndUpdate sur les ListBox, et l'effet "pourri" s'est atténué, j'ai plus l'impression de flash. Par contre l'élement sur lequel j'agis se retrouve en bas de la ListBox. Tu vois ce que je veux dire ? Comme sur les screenshots que j'ai pris :)
 
http://www.meow.fr/download/1.gif
http://www.meow.fr/download/2.gif


Message édité par TigrouMeow le 19-12-2005 à 14:45:09
Reply

Marsh Posté le 19-12-2005 à 15:22:15    

Ouais je comprend bien.
Jamais eu ce pb, mais j'utilise le DataBind avec beaucoup de modération...
 
* Une idée : utiliser une ListView au lieu d'un ListBox ? (ça marche ptet mieux. J'y crois pas, mais ça devrait pas être trop long à essayer)
 
* Une solution : ne pas utiliser de DataBind :)  tout faire à la main. Mais ça peut être galère...
 
* Une suggestion : tu dois avoir moyen aussi d'éviter ça en jouant sur les messages windows, en interceptant celui qui fait les déplacements après modif. Mais je peux pas t'en dire plus, je sais pas lequel, ni comment il fonctionne.
 
* Une remarque : ça ressemblerait pas un peu au défilement qui se produisent quand tu charges une grosse solution dans VS.Net, dans la fenêtre "Solution explorer" ? Si même MS ne sais pas faire un truc propre, je suis pas sûr qu'il faille lutter.
 
GL


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed