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 :

Problème de MAJ asynchrone d'un UpdatePanel : bloquage sur le controlID de asp:AsyncPostBackTrigger


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut Problème de MAJ asynchrone d'un UpdatePanel : bloquage sur le controlID de asp:AsyncPostBackTrigger
    Bonjour,


    J'ai une page, avec plusieurs UpdatePanel (3).

    Dans l'UpdatePanel A, j'ai une listView.


    Code de mon UPdatePanel A dans la page aspx :

    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
    34
    35
    36
    37
    38
    39
    40
    <asp:UpdatePanel
        ID ="uPanelA"
        runat="server" UpdateMode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddlGenArt"  EventName="SelectedIndexChanged" />
            <asp:AsyncPostBackTrigger ControlID="btnValidWarningModification" EventName="Click" />
        </Triggers>
            <ContentTemplate>
                <asp:Label ID="lblNoWarning" runat="server" Text="Aucun avertissement diponible" Visible="False" ForeColor="Red"></asp:Label>
                <table id="tblDisplayWarning" width="100%" visible="false" runat="server">
                    <tr>
                        <td align="center">
                            <asp:ListView ID="lvWarnings" runat="server" 
                                DataKeyNames="idEPCMountingWarning" 
                                onitemcommand="lvWarnings_ItemCommand" >
                                <LayoutTemplate>    
                                    <table border="1">
                                        <thead>
                                            <tr>
                                                <th>Avertissement</th>
                                                <th>Action</th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                            <asp:PlaceHolder runat="server" ID="itemPlaceHolder" />
                                        </tbody>
                                    </table>
                                </LayoutTemplate>
                                <ItemTemplate>
                                    <tr>
                                        <td><%# Eval("LibEPCMountingWarning")%></td>
                                        <td><asp:Button ID="btnUpdateWarning" runat="server" Text="Modifier" /></td>   
                                    </tr>
                                </ItemTemplate>
                            </asp:ListView>
                        </td>
                    </tr> 
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>

    Et donc en fait je veux déclencher une MAJ asynchrone de mon UpdatePanel B à l'aide du bouton "btnUpdateWarning" contenu dans la listView de mon UpdatePanel A.


    Code de mon UPdatePanel A dans la page aspx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <asp:UpdatePanel 
        ID="uPanelB"
        runat="server"
        UpdateMode="Conditional" >
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="???" EventName="Click" />
            </Triggers>
            <ContentTemplate>
                < ..... >
            </ContentTemplate>
        </asp:UpdatePanel>
    Pour ce faire, c'est dans le code de mon UpdatePanel B, dans la partie Triggers que ça se passe.
    Je bloque sur le controlID.
    Quand je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Triggers>
         <asp:AsyncPostBackTrigger ControlID="btnUpdateWarning" EventName="Click" />
    </Triggers>
    Ça ne fonctionne pas, déclenche même une exception.
    Quelle valeur dois-je mettre dans ControlID ?


    Je pense que soit faut que je fasse un FindControl, soit c'est parce que les boutons sont générés dynamiquement par ListView et du coup, l'ID du bouton est généré dynamiquement...

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Il n'y a aucun problème pour utiliser un bouton comme trigger dans plusieurs UpdatePanel. Exemple :

    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
    <asp:ScriptManager runat="server" id="manager" />
            <asp:UpdatePanel runat="server" ID="panel1"  UpdateMode="Conditional">
                <ContentTemplate>
                    <span>UpdatePanel 1: <%=DateTime.Now.ToString( ) %></span>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="bt" EventName="Click" />
                </Triggers>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="panel2"  UpdateMode="Conditional">
                <ContentTemplate>
                    <span>UpdatePanel 2: <%=DateTime.Now.ToString( ) %></span>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="bt" EventName="Click" />
                </Triggers>
            </asp:UpdatePanel>
     
            <asp:UpdatePanel runat="server" ID="panel3" UpdateMode="Conditional" ChildrenAsTriggers="false">
                <ContentTemplate>
                    <span>UpdatePanel 3: <%=DateTime.Now.ToString( ) %></span>
                    <asp:LinkButton runat="server" ID="bt" Text="Refresh" />
                </ContentTemplate>
            </asp:UpdatePanel>
    Par contre, un ID ne peut être référencé hors d'un contrôle "Bindable", comme les ListViews, les GridViews, etc...
    Pour résumer plus simplement. Tu as un ListView qui affichera 20 lignes, tu auras donc 20 boutons. Ces 20 boutons auront un ID différent.

    En espérant t'avoir aidé.

  3. #3
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Donc il n'est pas possible de définir mon bouton "btnUpdateWarning" comme étant un Triggers pour l'update de mon panel B ?

  4. #4
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Si on peut, mais pas de cette manière.

    Il te faut gérer l'event ItemCreated (je sais plus le nom exact, pour une GridView c'est RowCreated) dans ta ListView. Dans le code de la fonction, tu dois appeller ScriptManager.RegisterAsyncPostBackControl(btnUpdateWarning). Ainsi chaque bouton de tes lignes affiches dans ta ListView seront référencé comme "déclencheur de PostBack asynchrone".


    Enfin, il te faut aussi gérer l'event Click de ton bouton btnUpdateWarning pour faire un appel à uPanelB.Update().

    En espérant t'avoir aidé.

  5. #5
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    J'essaye de faire ce que tu m'as conseillé.





    Dans mon code behind aspx.cs,
    je n'arrive pas à accéder à ce fameux bouton "btnUpdateWarning" qui est à l'intérieur d'un itemTemplate, à l'intérieur de ma ListView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        protected void lvWarnings_ItemCreated(object sender, ListViewItemEventArgs e)
        {
             (Master.FindControl("ScriptManager1") as ScriptManager).RegisterAsyncPostBackControl(FindControl("btnUpdateWarning") as Button);
        }
    (le ScriptManager est dans ma MasterPage)

    --> Au deboguage, il y a une exception me disant que le "FindControl("btnUpdateWarning") as Button" renvoie Null.

  6. #6
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Normal, la fonction FindControl n'est pas récursive. Tu dois chercher le contrôle à partir de ton ListView et plus précisément de ton Item.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)
            {
                ListView lv = sender as ListView;
                ListViewDataItem item = e.Item as ListViewDataItem;
     
                if (lv.EditIndex == item.DisplayIndex)
                {
     
                    TextBox box = e.Item.FindControl("nameTextBox") as TextBox;
                }
            }

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

Discussions similaires

  1. Problème de MAJ de scrollbar
    Par franchouze dans le forum Tcl/Tk
    Réponses: 8
    Dernier message: 12/07/2007, 17h20
  2. [AJAX] [MSIE][DOM] MAJ de l'affichage
    Par yjuliet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/06/2007, 11h44
  3. [Ingres] petit problème de MAj - Min
    Par cyrill.gremaud dans le forum Langage SQL
    Réponses: 13
    Dernier message: 22/12/2006, 11h13
  4. Problème de MAJ d'une zone de liste
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 3
    Dernier message: 17/10/2005, 14h09
  5. [ServerSocket] Problème de bloquage sur readLine()
    Par thomaswilliamson dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 15/03/2005, 11h15

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