IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#] Déclencher action dans Repeater avec LinkButton


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut [C#] Déclencher action dans Repeater avec LinkButton
    J'ai imbriqué un repeater dans un datalist et inséré dans le repeater un linkbutton mais je n'arrive pas a relier a une action. deja voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <asp:datalist id="lstMat" ForeColor="Black" Font-Size="12px" runat="server" CellSpacing="1" BorderWidth="3px"
    				HorizontalAlign="Center" BorderColor="White" CellPadding="4" BackColor="White" Font-Names="Verdana,Arial,Helvetica,Geneva,Swiss">
    				<HeaderTemplate>
    					<TR class="OraTableControlBarText">
    						<TD width="25%"><FONT style="FONT-WEIGHT: bold" color="#336699">Date</FONT></TD>
    						<TD align="center"><FONT style="FONT-WEIGHT: bold" color="#336699">Matériel disponible</FONT></TD>
    						<TD align="center"><FONT style="FONT-WEIGHT: bold" color="#336699">Matériel déja 
    								réservé</FONT></TD>
    					</TR>
    				</HeaderTemplate>
    				<ItemTemplate>
    					<tr bgcolor="#f7f7e7">
    						<TD align="center"><%# (string)Container.DataItem %></TD>
    						<TD align="left">
    							<table style="color:Black;font-family:Verdana,Arial,Helvetica,Geneva,Swiss;font-size:12px;">
    								<asp:Repeater id="ListeMatDispo" runat="server" DataSource='<%# GetMatLibre((string)Container.DataItem) %>'>
    									<ItemTemplate>
    										<tr>
    											<td>
    												<%# ((IMateriel)Container.DataItem).parametres.Value+" "+((IMateriel)Container.DataItem).Marque+" "+((IMateriel)Container.DataItem).Modele %>
    											</td>
    											<td>
    												&nbsp;&nbsp;&nbsp;
    											</td>
    											<td>
    												<asp:LinkButton id=lnkReserver runat="server" OnClick='<%# ReserverCommand((string)((IMateriel)Container.DataItem).Id)%>'>Réserver</asp:LinkButton>
    											</td>
    										</tr>
    									</ItemTemplate>
    								</asp:Repeater>
    							</table>
    						</TD>
    J'ai raccourci le code dans cet exemple j'ai essayé dans la command OnClick d'appeler une fonction mais cela ne marche pas.C'est pareil si je mets dans le repeater OnItemCommand.
    A chaque fois il me souleve une exception au niveau du code html. Je pense qu'il y a un conflit avec le datalist initial.
    Comme faire marcher ce bouton??

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    a chaque fois que je mets un post personne ne repond

  3. #3
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Bon c'est surtout histoire que tu aie une réponse, j'ai pas vraiment de soluce.
    Tout d'abord l'evenement OnClick du LinkButton n'a aucune chance de fonctionner si celui ci fait partie d'un Repeater.
    Il faut en effet utiliser l'evenelent OnItemCommend du repeater pour recupérer le click sur le LinkButton.
    Si celà ne marche pas non plus c'est sans doute parce que le Repeater est imbriqué dans un DataList, c'est pas fait pour ca !!!
    La remontée de l'event doit s'arréter au niveau du Repeater.
    Eventuellemnt il faut essayer de récupérer l'event au Niveau du DataList mais je suis sceptique (personnellement j'ai banni les DataList au profit exclusif des Repeater).
    je pense qu'il faut tout gérer avec le Repeater quitte à mettre les mains dans le camboui en modifiant les items du repeater dans le code, ou faire un controle server a la place du repeater qui génère les events...

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    merci mais je pense que tu as raison a force de chercher par ci par la je pense que l'evenement ne remonte pas assez mais pourquoi des que je mets OnItemCommand ca plante??
    la probleme

  5. #5
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Si tu mets que le Repeater le OnItemCommand fonctionne trés bien...
    Si tu mets que le DataList le OnItemCommand fonctionnera aussi...
    Mais avec les deux imbriqués ca fonctionne pas, je pense que de toute facon que c'est assez dangeureux et imprévisible d'imbriquer les deux...
    Il faut savoir exactement dans quel ordre tout ca est généré et eventuellement s'il est possible de modifier la DataSource du Repeater a chaque OnItemCreate de la DataList pour que ca aie une réelle utilité (si c'est juste pour recopier le meme truc dans plusieurs cases il est facile de tout gérer avec le Repeater).
    La solution propre doit etre de réaliser un controle server à la place du repeater qui déclenche les évènements qui sont récupérés au niveau du OnItemCommand de la datalist mais ca demande un peu de boulot et c'est pas trés facile.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    En fait ce que je pensais c'etait mettre le onitemcommand dans la datalist
    et arriver a remonter l'evenement du linkbutton du repeater.

    Pour en revenir a mon choix, c'est que je vois pas d'autres manieres de le faire.Je suis debutant . Parce qu'en fait j'ai une liste de dates d'un coté et de l'autre pour chaque date je peux avoir une liste de matériel.
    Il s'agit en fait de réservation.
    Tout d'abord l'utilisateur réserve une salle pour une ou plusieurs dates. Et donc en suivant je lui propose de pouvoir reserver un materiel disponible pour la ou les dates.Pour une date c'est simple. Mais pour plusieurs...
    Donc je peux avoir ma liste de dates (datalist) et pour chacune je vais chercher la liste de matériel disponible (repeater imbriqué) avec un linkbutton pour chaque matériel pour effectuer la reservation.
    Enfin bref c'est le dernier truc que j'ai a faire pour mon stage et je crois que c'est le plus dur

  7. #7
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Arf...
    Donc a chaque Date une liste de matériel spécifique...
    Donc le dataSource de ton repeater doit changer a chaque Item de ta dataListe !
    J'y crois pas trop et je vois pas de solution simple.
    Moi je gèrerai ca avec un seul Repeater avec comme source de donnée une collection d'objet ayant une propriété Date et Nom ordonnés par Date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <asp:repeater>
    <Itemtemplate>
    <%# FonctionGenerantLeCodeDeRuptureSiChangementDeDate%>
      <tr><td><asp:LinkButton Text=<%# DataSource.Nom%> /></td></tr>
    <%# FonctionGenerantLeCodeDeRuptureSiFinChangementDeDate%>
    </Itemtemplate>
    </asp:repeater>
    En fait je crée une propriété DebutRupture et une propriété FinRupture pour mon objet qui est remplie lorsque je rempli la collection d'Objets.
    Et j'ai plus qu'a mettre <%# DataSource.DebutRupture %> et <%# DataSource.DebutRupture %> je trouve que c'est plus propre que la fonction.

    Une autre solution que j'utilise est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <asp:repeater>
    <Itemtemplate>
      <tr><td><asp:Label Text=<%# DataSource.Date%> /></td></tr>
      <tr><td><asp:LinkButton Text=<%# DataSource.Nom%> /></td></tr>
    </Itemtemplate>
    </asp:repeater>
    Qui affiche la date pour chaque matériel.
    Puis dans le code aprés avoir réalisé la DataBinding en parcourant les Items du repeater on, déclare le Repeater.Item.Controls(1).visible = false s'il n'y a pas de changement de date pour que le Label ne se voie pas dans ces cas la...

    Sinon il te reste le contrôle server mais la c'est nettement plus compliqué à réaliser...

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    controle server connais pas,lol.

    Ce que l'on voulait c'etait tout avoir dans le meme tableau.Sinon je vais faire une liste deroulante contenant toutes les dates et en en selectionnant une faire afficher le datalist correspondant a tous les matériels.

    Sinon une autre question j'ai essayé de recuperer le repeater a partir du datalist avec un findcontrol et il ne trouve rien c'est etrnage non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Repeater r = (Repeater)datalist.FindControl("ListeMatDispo");

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par bifidus
    Arf...
    Donc a chaque Date une liste de matériel spécifique...
    Donc le dataSource de ton repeater doit changer a chaque Item de ta dataListe !
    Sinon t'avais tout compris

  10. #10
    Membre régulier Avatar de chman
    Inscrit en
    Novembre 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 94
    Points : 97
    Points
    97
    Par défaut
    salut,

    par rapport à ce que tu as marqué, tu as un repeater par ligne de ton datalist, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Repeater r = (Repeater)e.Items.FindControl("ListeMatDispo");
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Repeater r = (Repeater)datalist.Items(i).FindControl("ListeMatDispo");
    sinon conceptuellement, je pense qu'il faut mieux ne pas imbriquer des éléments (ça surchage la page inutilement), mais découper par étape

  11. #11
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Ben je pense que le repeater n'est pas un Controle de la DataList mais de chaque Item de la DataList...
    Quand je veux acceder j'utilise (en VB)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataList.Items(i).Controls(1)
    Peut Etre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataList.Items(i).FindControl("ListeMatDispo")
    Fonctionne mais dans tous les cas FindControl est tres lourd par rapport a Controls(ControlNr).
    Dans tous les cas tu peux parcourir la collection des controls en demandant le nom de l'objet pour voir ce qu'il y a vraiment...
    Sinon tu as des exemples de la techique de la rupture à
    http://www.echecs.asso.fr/calendrier
    qui ressemble a ton pb mais ou y'a pas de LinkButton et à
    http://www.echecs.asso.fr/equipes (y faut sélectionner dans les listes à droite pour arriver à l'affichage des résultats avec des ruptures par ronde) et la il y a bien un LinkButton sur Chaque Ronde, il serait tout aussi facile d'en mettre un sur chaque match...
    Mais a chaque fois il y a une seule source de donnée comportant les dates et pas une source de donnée à chaque date ou Ronde et une propriété des objets qui génère la rupture ou qui masque leur affichage.

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par chman
    sinon conceptuellement, je pense qu'il faut mieux ne pas imbriquer des éléments (ça surchage la page inutilement), mais découper par étape
    Je suis d'accord avec toi mais mon maitre de stage voulais tout avoir sur la meme page afin d'avoir desuite une vision globale et ne pas faire un travail répétitif (choisir une date effectuer la reservation de matériel puis choisir une autre date....et ainsi de suite).C'est vrai que je trouve cela assez lourd et ca fait un peu "bricolage".
    Enfin je vais essayer avec votre aide.
    Merci bien

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    en fait ce findcontrol je ne peux pas l'utiliser dans la fonction declenchée par le OnItemCommand du datalist puisque l'évènement ne remonte pas jusqu'au datalist donc c'est la merde

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Bon en fait j'ai resolu mon probleme il suffit de mettre un lien a la place d'un link button et ca marche desole de vous avoir embêté

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/01/2014, 20h58
  2. Problème avec l'ajout d'action dans le menu
    Par F0ul dans le forum Débuter
    Réponses: 3
    Dernier message: 31/03/2009, 09h56
  3. Réponses: 3
    Dernier message: 10/10/2008, 18h43
  4. Réponses: 4
    Dernier message: 15/06/2006, 10h05
  5. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo