Colonne de datagrid et tri ...

Résolu
Signaler
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009
-
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009
-
Bonjour,

j'ai un petit souci avec un datagrid :
j'ajoute dynamiquement des colonnes dans ma datagrid de cette facon :

BoundColumn dgc = new BoundColumn();
dgc.DataField = astr_NomChamps;
dgc.SortExpression = astr_Tri;
dgc.ReadOnly = true;
dgc.HeaderText = astr_EnteteColonne;
this.dg.Columns.Add(dgc);

je rajoute une fonction de tri sur la datagrid de cette facon :

this.dg.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.dgStatsPri_SortCommand);

Le problème, c'est que quand je clique sur une colonne, le programme ne passe pas dans ma fonction de tri, alors que si je rajoute les colonnes directement dans la page aspx, "en dur", là, ça marche.

Quelqu'un aurait une idée d'où peut venir le problème ?

7 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
13 octobre 2010
29
Le problème est simple.

Quand tu rajoutes ta colonne, tu le fais aprés le page_load, une fois que tu auras cliqué sur le tri, la page va se faire un postback, hop ca passe dans l'init, puis ca recréer l'arborescence des controles, il voit que la page vient d'un postback, il regarde les controles qu'il a et il ne voit pas le controle de tri (normal vu qu'il est pas encore ajouté) puis tu ajoute ta colonne ...

pour que ceci fonctionne, il faut donc rajouter ta colonne avec l'abonnement à l'event au plus tard dans le page_init. Ceci se comprend trés bien si on connait comment fonctionne une page aspx de facon correcte :) (ce qui est loin d'etre simple :d)


<HR>
Cyril - MCP ASP.net - MVS
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009

Effectivement, je vois le principe. Là où ça va coincer, c'est que ma datagrid est dans un control utilisateur et que j'ajoute les colonnes dans le code behind de la page qui contient ce control utilisateur. Du coup, à moins d'une astuce que je ne connais pas, je ne peux pas ajouter les colonnes avant le Page_Init du control utilisateur. Je viend de vérifier, on passe d'abord par le page_init du control, puis dans le page_init de la page aspx (pour les page_load, c'est le contraire par contre).

Du coup, je suis bien bloqué là ...
Merci quand même pour ta réponse :)
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
13 octobre 2010
29
Effectivement tout ceci est emmerdant :p

La solution que je te propose c'est de passer ce que t'as besoin via une propriété de ton userControl ...

public class tonUC
inherits usercontrol

public property dgc as boundcolumn

end property

sub page_init
if not dgc is nothing then
this.datagrid1.columns.add(dgc)
end sub

end class

maintenant le problème c'est de passer la colonne au UserControl à partir de la page avant son init ... :p en .net2 la page a l'event preinit qui sert justement à ca :d

en .net1 il va te falloir surcharger une méthode qui arrive avant le init ... :) la toute premiere qui est appellé c'est processrequest mais il vaut mieux surcharger la derniere avant le page_init et ca doit etre createchildcontrols (pas sur) le mieux et que tu surcharges toutes les méthodes et rajoutent un point d'arret sur chacune :)

Je sais pas si j'ai été clair, donc hésite pas à demander d'avantages d'infos :)


<HR>
Cyril - MCP ASP.net
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009

y'a quelque part où trouver la liste des méthodes appelées ?

humm ... en fait, j'ai pensé à un truc, mais c'est peut-être un peu goret : les colonnes que je rajoute, je les garde soit en session, soit dans le viewstate (je sais pas ce qui est le plus gourment en ressource d'ailleurs) et dans le page_init de mon user controle, si on est en postback je rajoute les colonnes dans ma datagrid via ce que j'ai mis en viewstate/session. Maintenant, ça fait peut-être plus bidouille qu'autre chose et surtout, je sais pas quel impact ça peut avoir sur le temps d'affichage de la page et sur les ressources utilisés.

Je vais regarder les fonctions dont tu me parles pour voir celles qui sont appelé avant le page_init :)
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009

"y'a quelque part où trouver la liste des méthodes appelées ?" <= je voulais bien sur parler des méthodes appelés avant le page_init :p
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
13 octobre 2010
29
pour les méthodes : euh ... oui Reflector :D c'est comme ca que j'ai compris comment ca fonctionnait :p

autre solution c'est de surcharger toutes les méthodes, puis de mettre un point d'arret sur chaque surcharge tu verras rapidement ce qu'il se passe.

Pour ta solution goret oui je confirme c'est tres gore :p au pire utilises les sessions plutot que viewstate :p

au hasard ca doit se faire comme ca :

public overrides sub createchildControls(param)
mybase.createchildControls(param)

dim bdc = new boundcolumn();

me.usercontrol1.maprop = bdc
end sub

et c'est tout :)


<HR>
Cyril - MVS - MCP ASP
Messages postés
309
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2009

bon, ben je vois à peu près comment faire du coup :)
merci bien pour toutes ces réponses ^__^
(je vais accepter la première réponse parce que c'est elle qui explique le pourquoi du problème ^^)