Problème de LinkButton en asp.net

Signaler
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
SAM

En programmant, j'ai découvert un petit problème.

A gauche, une liste d'activité sous la forme d'une liste de LinkButton vertical. Au dessus les lettres de l'alphabet, pareil.
L'evenement OnCommand appelle deux fonctions (Click_Lettre et Click_Activite) qui liste au centre soit les sociétés commençant par la lettre ou les sociétés utilisant l'activité.

Jusque la, pas de problème.

Mais dans la liste des sociétés créés dynamiquement par la fonction, j'insère un LinkButton permettant d'appeler une autre fonction (Click_Distributeur) qui affichera, à son tour, toujours au centre, la liste des distributeurs de cette société.

Donc, pour chaque société, j'insère un LinkButton avec un evenement Command vers un autre fonction. Et la ca marche plus.

Apres plusieurs tests, j'en ai déduit que l'evenement Command ne fonctionne que si il est déclaré ou créé dans le chargement de la page. Si un LinkButton est créé lors d'un appel à une fonction résultat d'un evenement, ca ne marche pas.

Je vais contouner le problème en créant plutot des liens avec des paramètres et en les réccupérant par des Request mais ca fait plus programmation ASP 3.0 que ASP.NET.

A moins que quelqu'un n'ait la solution.

@+

12 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je suis pas sur d'avoir tout à fait saisi, ce que tu fais, tu pourrais nous mettre un bout de code stp, car la ca me semble assez complexe, et avec un bout de code ca va tout de suite s'eclaircir :)

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Voila un petit bout de code car il est assez long.

protected void Click_Activite(Object sender,CommandEventArgs e)
...
if (dr.Read())
{
if ((int)dr["nb"]>0)
{
ligne = new TableRow();
cellule = new TableCell();
cellule.ColumnSpan = 2;
cellule.Attributes.Add("align","right");
cellule.Text = "voir distributeurs (" + dr["nb"].ToString() + ")";
// lk = new LinkButton();
// lk.Text = "voir distributeurs (" + dr["nb"].ToString() + ")";
// lk.Attributes.Add("class","annuaireNavig");
// lk.CommandName = "numero de la société";
// lk.Command += new CommandEventHandler(Click_Distributeur);
// cellule.Controls.Add(lk);
ligne.Controls.Add(cellule);
ListeSociete.Rows.Add(ligne);
}
}

Click_Activite est une fonction déclenché par un évenement ayant eu lieu sur un LinkButton créé lors du chargement de la page.
Quand une activité est cliqué, j'affiche les sociétés dans un tableau avec leur distributeur en lien (les distributeurs sont des sociétés).
Un clique sur ce lien (LinkButton) devrait entrainer le déclenchement de la fonction Click_Distributeur mais c'est ça qui ne marche pas.
Le même code exécuté dans le Page_Load fonctionne trés bien. En revanche, quand il est exécuté par une fonction liée à un évenement, ca ne marche pas.

J'ai mis la création du LinkButton en commentaire. ListeSociete est un composant asp:Table dans la page.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
je code jamais en C#, je connais les grandes lignes mais tout ce qui est relatif aux evenements .... aie aie aie ....

Sinon tu dis
"Un clique sur ce lien (LinkButton) devrait entrainer le déclenchement de la fonction Click_Distributeur mais c'est ça qui ne marche pas."

Je ne vois nul part d'appellé la fonction Click_Distributeur et nul part ou celle ci pourrait etre appellé puisque c'est en commentaire ...

Je comprend pas tout la :(

Je reflechis à ca :big)

Cyril
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je crois avoir compris. le code que t'as mis en commentaire, c'est le code que t'aimerais faire fonctionner, et celui qui est la, c'est celui qui marche ?

donc ton problème, serait au niveau de l'association de l'evenement à un controle ? comme dit ci dessus, je ne connais pas la syntaxe du C#, ce que tu as fait me parait logique, et ce serait pour moi bon, mais je ne connais pas.
J'ai fait une source en VB.net, qui permmetais de créer un bouton en dynamique, et de réagir à ces evenements, regarde dans mes sources pour la retrouver.
sinon va voir sur csharpfr.com, ils vont surement mieux pouvoir t'aider que moi

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Salut Cyril.

Pour moi, c'est plus un pb relatif à asp.net. Effectivement, la syntaxe en commentaire est ce que je voudrais faire fonctionner. Et ce code marche très bien sauf que la fonction Click_Distributeur n'est pas exécuté lors de l'évenement.

Un exemple simple qui m'a permis de mettre en évidence le pb. J'ai mis un dans ma page.

Dans le Page_Load, j'associe son évenement Command avec un fonction Click_Toto. Quand je clique dessus, ça marche tres bien et la fonction est exécuté.

Je créé un deuxième LinkButton qui exécute une fonction Click_Tata. Dans Click_Tata, je mets le code de qui associe l'évenement Command de Toto avec Click_Toto (donc celui exécuté normallement dans le Page_Load).
Et la, ça marche pas.

A mon avis, le problème devrait se retrouver en vb.

De toute façon, je vais ça comme ne ASP 3, avec des request et puis ça ira bien mais c'est dommage.
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

De toute façon, je vais faire ça comme en ASP 3,...

(c'était pas français)
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
J'ai un peu plus saisi ton problème, ca me semble tout à fait logique que ca ne marche pas, car asp.net travaille en mode deconnecte, donc il oublie tout de ton client, je sais pas trop comment expliquer ca, mais si c'etait une application winform ca marcherait.
Je vois tres bien ou est le problème, mais je n'arrive pas à l'expliquer

en tout cas ta solution me semble bonne, et je ne vois pas de solution simple pour faire ca à la sauce .net

Je viens de voir une solution, mais ce serait faire ce que fait asp.net pour nous lorsqu'on associe un bouton à un evenement, il faut passer par javascript etc...

Mais si ca t'interesse vraiment, je peux tj t'aider, mais ca fait partie du mecanisme complexe d'asp.net

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Ca m'intéresse toujours d'apprendre mais pour le cas présent, ce sera pas du tout utilse de passer par du javascript pour reproduire le travail de .net.

J'ai re-programmé la page en utilisant les requests et les passages de paramètres dans l'adresse et ça fonctionne bien alors que je vais laisser comme ça.

Si ta solution qui passe par du Javascript et pas trop longue et trop complexe, par contre, je la veux bien. Ca peut toujours être utile.

Merci pour ton aide.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je sais pas si la solution va etre longue et complexe, je pense que oui, en tout cas pour complexe, je pense que oui, mais pas impossible, j'ai vu un article recemment qui permmetais d'appeller une fonction coté serveur via javascript, j'essaye de retrouver cet article puis je te le dis.

En deux mots ce que je pense c'est :

lors de la creation de ton linkbutton, on appelle à l'evenenement onclick une fonction javascript qui appellera une fonction coté serveur.

pour appeller la fonction javascript c'est pas compliqué, mais pour que javascript appelle la fonction coté serveur, ca l'est un peu plus :)

pour appeller la fonction javascript :

lk = new LinkButton();
lk.Attributes.Add("Onclick","javascript:"Lafunction");

ca devrait normalement ressembler à ca

je rechercher l'article

@+

Cyril
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
voici l'article :

http://www.dotnetjunkies.com/Tut...

malheureusement il est pour asp.net 2.0 mais c'est le meme truc qu'il nous faudrais, je vais essayer de regarder ca avec asp.net 1.1 mais ca risque d'etre encore plus compliqué :)

Cyril
Salut,

C'est marrant, g excatemtn le même problème que toi. Même le code est identique, sauf que moi, j'essaie de lancer une méthode pour une dropdownlist.
Ca fait des heures que je me casse la tête. Peux tu m'expliquer un peu plus en détail comment tu as réglé le problème. Si ce n'est pas trop demander, me dire ce que tu as ajouté et où tu l'as fait.
Un très grand merci d'avance.

Tof
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Oui, en faites, c'est très simple. Lorsque le Page_Load s'exécute, tous les évenements créé à ce moment la fonctionnent. En revanche, lorsqu'un évenement s'exécute, tu ne peux pas créér d'évenements dans ce code.

La solution est donc de créer tous les évenements dans le Page_Load (ou dans une méthode appelée par le Page_Load) même si tu rends le controle invisible. Ensuite, dans la methode associé à un evenement d'un controle, tu peux rendre tes controles invisible -> visible et les évenements fonctionneront.

A noter que tu peux meme faire des panneaux initialisé dans le Page_Load, avec les évenements, et tu rends le panneau invisible. Lors de ton choix de ta dropdownlist, tu rend le panneau visible et le tour est joué.

Le problème, c'est quand tu ne connais pas à l'avance qu'elle seront les controles créés. Par exemple, en fonction du choix dans la liste box, tu créé une certaine liste de controls à partir d'un base de do (par ex). A ce moment, les possiblités sont tellement grande que tu ne peux pas les préparer à l'avance.

La seule solution est alors d'envoyer les paramètres dans l'url et de les réccupérer par des request. (Ou dans des variables de sessions pour les rendres invisibles à l'utilisateur).

Par exemple : (dans mon traitement de l'evenement de ta dropdownlist)

TableRow ligne;
TableCell cell;
for (int i=0;i<nb;i++)
{
cell = new TableCell();
cell.Text = "" + texte[i] + "";
ligne.Controls.Add(cell);
tableau.Rows.Add(ligne);
}

et dans le Page_Load, tu réccupères le param et tu affiches ce que tu veux selon :

Page_Load( ... )
{
string param = "";
if (Request["param"] != null )
{
param = Request["param"].ToString();
}

if (param != "")
{
// affichage suite à un lien
}
else
{
// affichage quand pas de sélection sur un lien
}
}