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 :

Repeater de WUC + Postback


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut Repeater de WUC + Postback
    Bonjour,

    je rencontre un problème avec mon WebUserControl que je n'arrive pas à résoudre et je compte sur vous.

    ma page defaut :

    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
     
    <asp:DropDownList ID="ddlCountry" runat="server" OnSelectedIndexChanged="ddlCountry_SelectedIndexChanged" AutoPostBack="True">
            </asp:DropDownList>
     
            <br /><br />
            <asp:Repeater ID="rptUCSite" runat="server" Visible="true">
     
            <HeaderTemplate>
                </HeaderTemplate>
                <ItemTemplate>
                    <uc1:UCOCS ID="UC1" runat="server" SiteId='<%# DataBinder.Eval(Container.DataItem, "Id")%>'
                                                         SiteName='<%# DataBinder.Eval(Container.DataItem, "Name")%>'
       />
                </ItemTemplate>
                <FooterTemplate>
                </FooterTemplate>
            </asp:Repeater>
    Avec le code behind :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
        {
            int countryId = Convert.ToInt32(ddlCountry.SelectedValue);
     
                List<Site> lSite = SiteBLL.getAllSitesByCountry(countryId );
                rptUCSite.DataSource = Site;
                rptUCSite.DataBind();            
            }
        }
    Et mon UC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Site :
    <asp:Label ID="lblName" runat="server" Text=""></asp:Label>
    .................
    Code behind :
    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
     
    public partial class UCSite : System.Web.UI.UserControl
    {
        private int _SiteId;
     
        public int SiteId
        {
            get { return _SiteId; }
            set { _SiteId = value; }
        }
     
        private string _name;
     
        public string SiteName
        {
            get { return _name; }
            set { _name = value; }
        }
     
     
        protected void Page_Load(object sender, EventArgs e)
        {
                //information about theSite
                lblName.Text = SiteName;
                .......
        }
    Rien de très compliqué apparament.

    Mais en fait, on peut remarquer que le 'remplissage' du repeater se fait après un postback.

    Du coup le pageLoad de mon UC se fait avant que ces propriétés SiteId/Sitename soient remplies. Donc lblName.Text est toujours null.

    je change donc mon pageLoad en Page_unLoad et cette fois les setters sont bien appelés avant et donc lblName.Text a bien la bonne valeur.

    Mais comme cette instruction a lieu dans le UnLoad, la valeur n'apparait pas dans la page.

    Je ne sais donc plus comment faire pour contourner mon probleme.
    J'aimerais éviter d'appeler une nouvelle page une fois mon pays choisis.

    Merci de votre aide.

    Bizet

  2. #2
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Pourquoi ne pas realiser alors une fonction d'initialisation de ton UC que tu coupleras a 'evenement databind de celui ci. Aisi lorsque tu realiseras le databind dans ta page , celle ci appellera la databind de ton controle et ce derniere s'initialisera avec les bonnes valeurs.

  3. #3
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Citation Envoyé par Arthis Voir le message
    Pourquoi ne pas realiser alors une fonction d'initialisation de ton UC que tu coupleras a 'evenement databind de celui ci. Aisi lorsque tu realiseras le databind dans ta page , celle ci appellera la databind de ton controle et ce derniere s'initialisera avec les bonnes valeurs.
    Pourquoi?? Parce que je ne connais pas et que je vois pas trop ce que tu veux dire

    Si j'ai bien compris, dans le code behind de mon UC, je créé une fonction qui initialise mes propriétés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void initialize(...)
    {
    Name = ...;
    SiteId = ...;
    }
    Et je couple cette fonction a mon databind?

    Mais comment est ce que l'on fait ca??

    Merci de tes précisions.

  4. #4
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    voici un exemple avec une apge default.aspx et un web user control :

    Default.aspx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            <asp:Button ID="C_Btn_Launch" runat="server" Text="DO the postback" 
                onclick="C_Btn_Launch_Click" />
            <br />
            <br />
           <br /> 
            <uc1:WebUserControl1 ID="C_UC_Test" runat="server" />
    Default.aspx.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      protected void C_Btn_Launch_Click(object sender, EventArgs e)
            {
     
                C_UC_Test.SiteName = "test site name";
                C_UC_Test.DataBind();
            }

    et le web user control :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
     Inherits="testUC.WebUserControl1" %>
    <asp:Label ID="C_Lbl_Test" runat="server" Text="Label"></asp:Label>
    avec son code c#:
    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
          private string _name;
     
            public string SiteName
            {
                get { return _name; }
                set { _name = value; }
            }
     
     
            private void InitPage()
            {
                C_Lbl_Test.Text = _name;
            }
     
     
            protected void Page_Load(object sender, EventArgs e)
            {
     
            }
     
            protected override void OnDataBinding(EventArgs e)
            {
                base.OnDataBinding(e);
                InitPage();
            }
    Comme tu le vois la propriete SiteName du uc est initialisée lors d'un postback: Je fais ensuite appel a l'evenement databind qui lui affectera les valeurs correctement.

    Bon code à toi,

  5. #5
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Grâce à tes indications, ca avance pas mal du tout.

    En fait ce que tu as loupé Arthis, c'est que je suis dans un repeater qui contient justement ce UC.

    Voila comment je procede :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected void rptUCSite_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item)
            {
                int Siteid = Convert.ToInt32(((HiddenField)e.Item.FindControl("SiteId")).Value);
                string name = ((HiddenField)e.Item.FindControl("Name")).Value;
                UCSite uc = (UCSite)e.Item.FindControl("UC1");
                uc.SiteId = Siteid;
                uc.Name = name;
                uc.DataBind();
            }
        }
    Et pour le moment ca se passe bien.

    Mais, je rencontre du coup un autre soucis :

    dans mon UC j'ai un gridView sur lequel je fais un Bind :
    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
     
     protected override void OnDataBinding(EventArgs e)
        {
            base.OnDataBinding(e);
            InitPage();
        }
     
        private void InitPage()
        {
            //information about the Site
                lblName.Text = SiteName;
     
                //Get all Objects of the Site
                List<Obj> lObj = ObjBLL.getAllObj(siteId);
     
                gridView.DataSource = lObj ;
                gridView.DataBind();
     
                foreach (GridViewRow gvr in gridView.Rows)
                {
                    int Id = Convert.ToInt32(((HiddenField)gvr.FindControl("hiddenId")).Value);
                   int start = Convert.ToInt32(((HiddenField)gvr.FindControl("hiddenStart")).Value);
                    int end= Convert.ToInt32(((HiddenField)gvr.FindControl("hiddenEnd")).Value);
                }
     
        }
    avec dans mon UC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <asp:GridView ID="gridView" runat="server" >
        <Columns>
            <asp:TemplateField HeaderText="">
                <ItemTemplate>
                    <asp:HiddenField ID="hiddenId" runat="server" Value='<%# Bind("Id") %>' />
                    <asp:HiddenField ID="hiddenStart" runat="server" Value='<%# Bind("Start") %>' />
                    <asp:HiddenField ID="hiddenEnd" runat="server" Value='<%# Bind("End") %>' />
                </ItemTemplate>
            </asp:TemplateField>
    Et le probleme est que le bind du gridview ne se fait pas car 'je pense' le databind de l'UC n'est pas fini.

    J'arrive donc a la fin de mon InitPage mais les valeurs récupérés
    int ID; int Start; intEnd sont vides car pas encore grinde...
    (est ce que je me trompe?)

    Comment contourner ce probleme pour que je puisse avoir le contenu de mon gridview pour faire mes traitements dessus??

    Merci

  6. #6
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Normalement, il ne devrait pas y avoir de soucis. As tu vériíé que ta liste d'objet lObj etait bien implémentée?

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

Discussions similaires

  1. PostBack sur un Repeater avec MenuContextuel
    Par Devinformatique dans le forum C#
    Réponses: 0
    Dernier message: 19/02/2013, 13h47
  2. [c#][2.0]Repeater label et postback
    Par malbaladejo dans le forum ASP.NET
    Réponses: 6
    Dernier message: 31/10/2006, 14h20
  3. [VB.Net]Evenement dans un Repeater !!
    Par m-mas dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/09/2004, 17h13
  4. [C#] Postback à la place de onclick avec Entrée
    Par Anomaly dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/09/2004, 14h35
  5. [C#] Déclencher action dans Repeater avec LinkButton
    Par globeriding dans le forum ASP.NET
    Réponses: 13
    Dernier message: 13/05/2004, 15h29

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