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 :

Souci de gestion du postback dans un updatePanel


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Souci de gestion du postback dans un updatePanel
    Bonjour tout le monde.

    Je crois que j'ai encore zappé un détail dans la gestion du PsotBack dans un UpdatePanel, mais je trouve pas.

    Alors je soumets mon code :
    Côté HTML :
    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
     
    <%@ Control Language="VB" AutoEventWireup="false" CodeFile="GestionMenu.ascx.vb" Inherits="Module_Gite_GestionMenu" %>
    <asp:DropDownList ID="ddlMenu" runat="server" AutoPostBack="true"></asp:DropDownList>
    <ajax:UpdatePanel ID="upMenu" runat="server" ChildrenAsTriggers="true">
        <Triggers>
            <ajax:AsyncPostBackTrigger ControlID="ddlMenu" EventName="SelectedIndexChanged" />
        </Triggers>
        <ContentTemplate>
        <asp:Table ID="tblMenu" runat="server">
            <asp:TableRow>
                <asp:TableCell>
                    <asp:Button ID="btnEnregistrer" runat="server" Text="Enregistrer" />
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="tblDetailMenu" runat="server"></asp:Table>
        <asp:Button ID="btnEnrDetailMenu" runat="server" Text="Enregistrer modifications" />
     
        </ContentTemplate>
    </ajax:UpdatePanel>
    J'ai enlevé quelques TableRow pour faire plus léger. Elles affichent des données, sans rapport avec mon soucis.

    Donc, à l'affichage on a une DDL en haut, des champs et un bouton "Enregistrer".
    Juste en dessous, on a un bouton "Enregistrer modifications".

    Lorsque l'on va choisir un truc dans la DDL il va y avoir une table qui va se mettre entre les deux boutons. Dans le CodeBehind, vous verrez tout cela, mais je ferais un peu de netoyage, pour que se ne soit pas imbuvable tout en gardant l'essentiel.

    Voici le CodeBehind :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Partial Class Module_Gite_GestionMenu
        Inherits System.Web.UI.UserControl
     
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            Dim dtlstMenu As DataTable = New DManager("Datadev").RetournerTable("SELECT MenuGiteId, NomMenu FROM dbo.GITE_MenuTitre WHERE ApplicationId = '" & Session("SES_ApplicationStr") & "'")
            With ddlMenu
                .DataSource = dtlstMenu
                .DataTextField = "NomMenu"
                .DataValueField = "MenuGiteId"
                .DataBind()
                .Items.Insert(0, New ListItem("...", 0))
            End With
        End Sub
     
        Protected Sub ddlMenu_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlMenu.SelectedIndexChanged
            Dim dtMenuTitre As DataTable = New DManager("DataDev").RetournerTable("SELECT * FROM dbo.GITE_MenuTitre WHERE MenuGiteId = '" & ddlMenu.SelectedValue & "'")
            txtNomMenu.Text = dtMenuTitre.Rows(0).Item("NomMenu")
            txtOrdreMenu.Text = dtMenuTitre.Rows(0).Item("OrdreMenu")
            txtTitreMenu.Text = dtMenuTitre.Rows(0).Item("TitreMenu")
     
            Dim dt As DataTable = New DManager("DataDev").RetournerTable("SELECT * FROM GITE_MenuGiteDetail WHERE MenuGiteId = '" & ddlMenu.SelectedValue & "'")
            For Each dr As DataRow In dt.Rows
                Dim r As New TableRow
                Dim cTexte, cOrdre As New TableCell
                Dim TexteMenu, OrdreMenu As New TextBox
                Dim hfIdDetailMenu As New HiddenField
                With hfIdDetailMenu
                    .Value = dr.Item("IdMenuGiteDetail")
                End With
                With TexteMenu
                    .Text = Replace(dr.Item("TexteMenu"), "<br />", vbCrLf)
                End With
                With OrdreMenu
                    .Text = dr.Item("OrdreMenuGite")
                End With
                cTexte.Controls.Add(TexteMenu)
                cOrdre.Controls.Add(OrdreMenu)
                cOrdre.Controls.Add(hfIdDetailMenu)
                r.Cells.Add(cTexte)
                r.Cells.Add(cOrdre)
                tblDetailMenu.Rows.Add(r)
            Next
        End Sub
     
        Protected Sub btnEnrDetailMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEnrDetailMenu.Click
            Logage("biloute" & tblDetailMenu.Rows.Count)
            Try
                For Each r As TableRow In tblDetailMenu.Rows
                    Dim TexteMenu As TextBox = r.Cells(0).FindControl(0)
                    Dim OrdreMenu As TextBox = r.Cells(1).FindControl(0)
                    Dim hfIdDetailMenu As HiddenField = r.Cells(1).FindControl(1)
                    Dim z As String = New DManager("DataDev").RetournerScalaire("UPDATE GITE_MenuGiteDetail SET TexteMenu = '" & TexteMenu.Text & "', OrdreMenu = '" & OrdreMenu.Text & "' WHERE Id = '" & hfIdDetailMenu.Value & "'")
                    Logage("UPDATE GITE_MenuGiteDetail SET TexteMenu = '" & TexteMenu.Text & "', OrdreMenu = '" & OrdreMenu.Text & "' WHERE Id = '" & hfIdDetailMenu.Value & "'")
                Next
            Catch ex As Exception
                Logage(ex.Message)
            End Try
        End Sub
    End Class
    Le résultat que j'ai est malheuresement simple : dans la procédure du click du bouton "Enregistrer modifications" vous voyez en première ligne " Logage("biloute" & tblDetailMenu.Rows.Count)" c'est une procédure à moi qui log des choses dans un fichier texte, ça me permet de faire un debug sur mesure.

    Là, vous aurez facilement vu que je cherche à connaitre le nombre de Row dans la Table au moment du click et le nombre est 0.
    Du coup, je me dis qu'il doit y avoir du PostBack dérrière tout ça, mais je sèche, je ne vois pas trés bien comment le gérer.

    Pouvez vous m'aider ?

  2. #2
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Heu, j'ai avancé sur le truc, enfin, non, j'ai plutôt reculé, en fait.

    J'ai viré l'UpdatePanel, en me disant que ça venait de lui. Mais enfait, c'est la même chose.

    Alors là, je capte vraiment plus. soit je suis tellement dedans je vois même plus al bourde monstrueuse que j'ai du faire, soit je dois tout réapprendre.

    Y aurait pas une âme charitable pour me donner un petit coup de main, SVP ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Je pense que ca vien du fait que les rows de ta table tblDetailMenu soient construit en dynamique.

    EN gros tous ce qui est construit en dynamique doit être reconstruit a chaque postback.

    C'est à dire que quand tu construit tes rows la première fois tous va bien, mais quand tu reviens, étant donné qu'elle sont dynamique, asp.Net ne se souvient pas qu'elles sont la. (voir comment fonctionne le cycle de vie et la persistance des controls)
    Et donc voit ta table comme elle est arrivé précédemment c'est à dire vide.

    Reconstruit ta table a chaque postback et ca devrait etre bon.

    sinon je te conseil d'utiliser un repeater qui gèrera mieux la datasource.

    Pour la asp:Table je l'utilise pas beaucoup, mais ton probléme ressemble beaucoup a un problème de control ajouter dynamiquement.

    edit: Je suis sur que ton problème vient dut fait que ca soit dynamique.
    Si ca t'intéresse et que tu as un peu le temps je te conseil cette lecture (anglais) en 4 partie:
    http://weblogs.asp.net/infinitiesloo...t-1_2900_.aspx

    sinon va directement a la troisième partie au niveau du titre "Be Responsible for the Control Tree" qui t'indiquera exactement le problème que tu as.

  4. #4
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    J'ai essayé de reconstruire la table, mais il la reconstruit avec les données de base, pas les données modifiées.

    Bon, maintenant, j'ai pas essayé avec un Repeater, mais quoi qu'il arrive, il sera généré dynamiquement puisqu'il est fonction de ce qui est choisi dans la DDL.

    Ce que je comprend pas c'est que je fais le même genre de chose dans un autre composant et ça marche bien. La base de mon code est justement un copier coller du composant qui marche et là, ça marche plus !!!

    Je pige pas.

    Merci pour ton aide.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Alors en fait le repeater ne sera pas construit dynamiquement au sens ou rajoute des control n'existant pas a l'arrivé du postback.

    En gros tu ajoute des controls (new TableRow) Toi même.
    Tu en es "Responsable" asp.net ne "sait" pas qu'ils sont la.

    Avec un repeater, il connait ta datasource et asp.net reconstruit le repeater et donc tu récupère tout sans rien faire.

    Pour reconstruire ta table il faudrait que tu enregistre ta DataSource utilisée (ta dataTable) en Cache ou en Session (attention au cache et au partage d'info entre utilisateurs).

    Sur ton précèdent composant tu ajoutes vraiment les rows à la volée (avec des new)?

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Ok, je vois bien le truc du cycle de vie (mais je crois que j'ai toujours du mal avec ça).

    Et oui, avec des New j'ajoute mes row, mes cell, mes label et mes textbox et j'ai beau lire et relire mon code, je gère pas de postback, pas de ViewState, rien, je met tout en vrac et ça marche.

    Donc, le Repeater va prendre directement les Data et garde en "mémoire" les modifications ?

    Bon, je fini le netoyage du code pour tester le REpeater et je reviens te donner le résulat du test. ça m'a l'air plus simple, en fait.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/06/2012, 08h56
  2. Réponses: 12
    Dernier message: 08/10/2010, 10h23
  3. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44
  4. Gestion du blit dans un moteur2D
    Par Fry dans le forum DirectX
    Réponses: 2
    Dernier message: 01/11/2004, 02h05
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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