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 :

Event et postback


Sujet :

ASP.NET

  1. #1
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut Event et postback
    Bonjour,

    J'ai un petit problème

    Il est lié à un post précédent : http://www.developpez.net/forums/d98...le-rows-count/

    Voici le code aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      <div class="P_SaisieC">
                                <asp:Table ID="Tab_CS" runat="server" CssClass="Centre_AspTable" >
                                    <asp:TableRow>
                                        <asp:TableCell><asp:Label ID="LB_CS_det" runat="server" Text="Contrat de service" width="130" CssClass="REP_Titre"></asp:Label></asp:TableCell>  
                                        <asp:TableCell><asp:Label ID="LB_val" runat="server" Text="Valeur Accordée" width="130" CssClass="REP_Titre"></asp:Label></asp:TableCell> 
                                        <asp:TableCell><asp:Label ID="Label3" runat="server" Text="Périodicité" width="130" CssClass="REP_Titre"></asp:Label></asp:TableCell> 
                                        <asp:TableCell><asp:Label ID="Label7" runat="server" Text="Mode de Facturation" width="130" CssClass="REP_Titre"></asp:Label></asp:TableCell> 
                                        <asp:TableCell><asp:Label ID="Label8" runat="server" Text="Mode de règlement" width="130" CssClass="REP_Titre"></asp:Label></asp:TableCell>
                                    </asp:TableRow>
                                </asp:Table>
                             </div>
    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
    protected void Page_Load(object sender, EventArgs e)
            {
            []    
                    if (IsPostBack == false)
                    {
                        if (Request["type"] == "CLOC")
                        {
                            []
     
                            if (test)
                                Tab_CS.Visible = true;
                            else
                                Tab_CS.Visible = false;
     
                        }
     
                        Session["TEMPO"] = null;
                    }
                    else
                    {
                        if (Session["TEMPO"] != null)
                        {
                            bool isfirst = true;
                            foreach (TableRow _row in (TableRowCollection)Session["TEMPO"])
                            {
                                if (!isfirst)
                                    Tab_CS.Rows.Add(_row);
                                else
                                    isfirst = false;
                            }
                        }
                    }
                }
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     public void VALID_CESS(object sender, RepeaterCommandEventArgs e)
            {
                RepeaterItem _ligne = e.Item;
     
                TextBox _TB_CS = (TextBox)_ligne.FindControl("TB_CS");
                CheckBox _CHB_CessionOK = (CheckBox)_ligne.FindControl("CHB_CessionOK");
                HiddenField _HF_id = (HiddenField)_ligne.FindControl("HF_id");
     
                CL_CS _cs = new CL_CS(int.Parse(_HF_id.Value),_TB_CS.Text);
                _cs.LISTER_TERMESFACT();
                _cs.RECUP_LISTE_MODREGL();
                _cs.LISTER_PERIODICITES();
     
                if (_CHB_CessionOK.Checked)
                {
                    Tab_CS.Rows.Add(new TableRow());
     
                    //Nom
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
                    Label _lb = new Label();
                    _lb.Text = _TB_CS.Text;
                    _lb.CssClass = "REP_ContenuC_spe_G2";
                    _lb.ID = "LB_" + _TB_CS.Text;                
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[0].Controls.Add(_lb);
     
                    // Valeur
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
                    TextBox _tb = new TextBox();
                    _tb.CssClass = "REP_ContenuC_spe_G2";
                    _tb.ID = "TB_val_" + _TB_CS.Text;
                    _tb.AutoPostBack = true;
                    _tb.TextChanged += EVENT_ITM;
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[1].Controls.Add(_tb);
     
                    //  Periodicité
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
                    ListBox _lst_per = new ListBox();
                    _lst_per.CssClass = "REP_ContenuC_spe_G2";
                    _lst_per.Rows = 1;
                    _lst_per.DataSource = _cs.lesPeriodicites;
                    _lst_per.DataTextField = "nomperiod";
                    _lst_per.DataValueField = "idPeriod";
                    _lst_per.DataBind();
                    if(_lst_per.Items.Count == 0)
                        _lst_per.Items.Insert(0, "Aucun");
                    else
                        _lst_per.Items.Insert(0, "");
     
                    _lst_per.ID = "LST_period_" + _TB_CS.Text;
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[2].Controls.Add(_lst_per);
     
     
                    // Mode de facturation
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
                    ListBox _lst_mod = new ListBox();
                    _lst_mod.CssClass = "REP_ContenuC_spe_G2";
                    _lst_mod.Rows = 1;
                    _lst_mod.DataSource = _cs.lesTermesFact;
                    _lst_mod.DataTextField = "termfac";
                    _lst_mod.DataValueField = "idtermefact";
                    _lst_mod.DataBind();
                    if (_lst_mod.Items.Count == 0)
                        _lst_mod.Items.Insert(0, "Aucun");
                    else
                        _lst_mod.Items.Insert(0, "");
                    _lst_mod.ID = "LST_mod_" + _TB_CS.Text;
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[3].Controls.Add(_lst_mod);
     
                    // Mode reglement
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
                    ListBox _lst_rgl = new ListBox();
                    _lst_rgl.CssClass = "REP_ContenuC_spe_G2";
                    _lst_rgl.Rows = 1;
                    _lst_rgl.DataSource = _cs.lesModRegl;
                    _lst_rgl.DataTextField = "nom";
                    _lst_rgl.DataValueField = "idmod";
                    _lst_rgl.DataBind();
                    if (_lst_rgl.Items.Count == 0)
                        _lst_rgl.Items.Insert(0, "Aucun");
                    else
                        _lst_rgl.Items.Insert(0, "");
                    _lst_rgl.ID = "LST_regl_" + _TB_CS.Text;
                    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[4].Controls.Add(_lst_rgl);
     
                    Tab_CS.Visible = true;
                    Session["TEMPO"] = Tab_CS.Rows;
                }
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      protected void EVENT_ITM(object sender, EventArgs e)
            {
                [...]
                SAVE(control,value);
            }
     
            #endregion
    Voila mon problème maintenant c'est qu'il y à des postback dans tout les sens et je suis perdu, je ne sais plus trop comment faire. Vous l'avez compris je veux sauvegarder les valeur de chaque control contenu dans la table.

    PS : Seul la TB est codé pour le moment c'est normal ^^

    Si vous avez une idée cela m'aiderai grandement.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2010
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2010
    Messages : 164
    Par défaut
    Pourquoi vouloir à chaque exécuter qqch dans le textChanged des textbox ?
    C'est ça qui cause les postbacks à chaque fois.

    Que veux tu faire exactement ?

  3. #3
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Alors en fait lorsque je rajoute un second élément dans ma table tout ce passe bien à priori (en tout cas au niveau de l'affichage) mais lorsque je click sur mon bouton de validation et que je regarde en débug ce que contient ma table, jen 'ai que 2 élément (la premier ligne qui sont les titres de colonne, et mon premier élément). Ma troisième ligne de la table visible à l'écran n'est pas utilisable au niveau du code, il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		Tab_CS.Rows[2].Cells[1].Controls[0]	'Tab_CS.Rows[2]' a levé une exception de type 'System.ArgumentOutOfRangeException'	System.Web.UI.Control

  4. #4
    Membre émérite Avatar de Ramajb
    Homme Profil pro
    ----------------------------
    Inscrit en
    Septembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ----------------------------

    Informations forums :
    Inscription : Septembre 2007
    Messages : 476
    Par défaut
    Déjà, la façon dont tu écrit le code est un peu bizarre:
    1- tu fais un ajout d'une TableRow dans la collection Rows
    2- tu récupéré l'instance de ce dernier pour faire un ajout TableCell
    3- tu récupéré encore l'instance déjà dans la collection du dernier pour ajouter un Label.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Tab_CS.Rows.Add(new TableRow()); 
    //Nom
    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells.Add(new TableCell());
    Label _lb = new Label();
    _lb.Text = _TB_CS.Text;
    _lb.CssClass = "REP_ContenuC_spe_G2";
    lb.ID = "LB_" + _TB_CS.Text;                
    Tab_CS.Rows[Tab_CS.Rows.Count - 1].Cells[0].Controls.Add(_lb);
    Pour moi l’idéal est de:
    1- créer une instance TableRow
    2- créer une instance TableCell
    3- créer Label control et initialisation des propriétés
    4- ajouter le label dans TableCell
    5- ajouter TableCell dans TableRow
    6- ajouter TableRow dans Table
    C'est plus lisible et explicite.

  5. #5
    Membre émérite Avatar de Ramajb
    Homme Profil pro
    ----------------------------
    Inscrit en
    Septembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ----------------------------

    Informations forums :
    Inscription : Septembre 2007
    Messages : 476
    Par défaut
    Salut,

    A chaque fois que tu click sur le bouton tu auras une nouvelle ligne dans la page. Tu l'adapte a ta besoin après.

    Dans l'evt Load de la page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            //private member
            public TableRowCollection _rows;
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (Session["TEMPO"] != null)
                {
                    _rows = (TableRowCollection)Session["TEMPO"];
                }
            }
    Dans l'evt Click du bouton, j'ai mis:
    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
     
            protected void Button1_Click(object sender, EventArgs e)
            {
                TableRow row = new TableRow();
     
                //Nom
                Label _lb = new Label();
                _lb.Text = "Text from repeater";
                _lb.CssClass = "REP_ContenuC_spe_G2";
                _lb.ID = "LB_" + new Random().Next().ToString();
                TableCell cell1 = new TableCell();
     
                cell1.Controls.Add(_lb);
     
                // Valeur            
                TextBox _tb = new TextBox();
                _tb.CssClass = "REP_ContenuC_spe_G2";
                _tb.ID = "TB_val_" + new Random().Next().ToString();
                TableCell cell2 = new TableCell();
     
                cell2.Controls.Add(_tb);
     
                row.Cells.Add(cell1);
                row.Cells.Add(cell2);            
     
                if (_rows != null)
                {
                    _rows.Add(row);
                    ArrayList a = new ArrayList(_rows);
                    TableRow[] tg = (TableRow[])a.ToArray(typeof(TableRow));                
                    Table1.Rows.AddRange(tg);
                }
                else
                    Table1.Rows.Add(row);
     
                Session["TEMPO"] = Table1.Rows;
            }
    Pour ton cas, au lieu de le mettre dans le click event , tu le met dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void VALID_CESS(object sender, RepeaterCommandEventArgs e)
    Fais moi savoir s'il y a des commentaires.
    NB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Table ID="Table1" runat="server"></asp:Table>
            </p>
            <asp:Button ID="Button1" runat="server" Text="Send" OnClick="Button1_Click" />
        </form>
    </body>
    Ici, j'ai pas défini le tableRow pour les headers, je pense que le mieux sera de le faire dynamiquement, ainsi on évite le risque de "doublon" avec celui qui a été déjà sauvegardé dans la session.

    En espérant t'avoir aidé

  6. #6
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Salut,

    merci pour ton aide, la construction de la table est bonne par contre j'ai toujours le même problème.

    En gros voila se qui doit se passé dans l'ordre :

    - L'utilisateur choisi des contrat dans un repeater : OK
    - Construire la table : : OK
    Colonne 1 : nom du contrat
    Colonne 2 : valeur du contrat (tb à remplir)
    Colonne 3 : Périodicité (listbox pour sélectionner un élément)
    Colonne 4 : Facturation (listbox pour sélectionner un élément)
    Colonne 5 : règlement (listbox pour sélectionner un élément)
    - L'utilisateur entre la valeur, et fait ses choix dans les listbox : OK
    - L'utilisateur click sur un bouton (hors de la table) : OK
    - Récupéré les données entrée / saisie par l'utilisateur : NOK

    En fait avec ta méthode une fois que le client à cliqué sur le bouton, la table est vidé, et impossible de récupéré les données.
    Comment faire

  7. #7
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Le truc qui me blaze c'est que à l'écran tout est bon !

    Est-ce que je peux pas faire mon traitement avant le postback par exemple ?

  8. #8
    Membre émérite Avatar de Ramajb
    Homme Profil pro
    ----------------------------
    Inscrit en
    Septembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ----------------------------

    Informations forums :
    Inscription : Septembre 2007
    Messages : 476
    Par défaut
    On n'a pas besoin de sauvegarder tous les éléments de la table qui ont été générés dynamiquement, en effet ces éléments peuvent être changés après PostBack, imagine que l'utilisateur a change une ligne alors que la session stock encore l'ancienne valeur.
    L'idée c'est de sauvegarder le nombre des lignes de la table, suffixer chaque ID du control par son numéro de ligne, récupérer la valeur avant le postBack en utilisant Request.Form["xxxx_numeroLigne"] et régénérer touts les controls et le mettre dans la collection Row de la table.
    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
    61
    62
    63
    64
    65
    66
    67
    68
      protected void Page_Load(object sender, EventArgs e)
        {
     
            if (!Page.IsPostBack)
            {
                Session["NbrRow"] = 0;
            }
        }
     
     
        protected void Button1_Click(object sender, EventArgs e)
        {
            int nextRow = (int)Session["NbrRow"] + 1;
            Session["NbrRow"] = nextRow;
            // Ajouter toutes les lignes
            for (int i = 1; i <= nextRow; i++)
            {
                Table1.Rows.Add(AddNewRow(i));
            }
        }
     
     
        public TableRow AddNewRow(int i)
        {
            TableRow row = new TableRow();
     
            //Nom
            Label _lb = new Label();
            _lb.Text = "Text from repeater";
            _lb.CssClass = "REP_ContenuC_spe_G2";
            _lb.ID = "LB_" + i.ToString();
            TableCell cell1 = new TableCell();
     
            cell1.Controls.Add(_lb);
     
            // Valeur            
            TextBox _tb = new TextBox();
            _tb.CssClass = "REP_ContenuC_spe_G2";
            _tb.ID = "TB_val_" + i.ToString();
            _tb.Text = GetValueTexBox(i);
            TableCell cell2 = new TableCell();
     
            cell2.Controls.Add(_tb);
     
            row.Cells.Add(cell1);
            row.Cells.Add(cell2);
     
            return row;
        }
     
        /// <summary>
        /// 
        /// </summary>
        /// <param name="positionRow"></param>
        /// <returns></returns>
        private string GetValueTexBox(int positionRow)
        {
            string result = string.Empty;
            //premier postBack, pas de traitement
            //le dernier control genere, pas de traitement aussi
            if ((int)Session["NbrRow"] == 1 || (int)Session["NbrRow"] == positionRow)
            {
                return result;
            }
            result = Request.Form["TB_val_" + positionRow.ToString()].ToString();
     
            return result;
        }
    Fais moi savoir si tu as des questions.

Discussions similaires

  1. association Cross PostBack Page et Event handlers impossible
    Par blaise.braye dans le forum ASP.NET
    Réponses: 4
    Dernier message: 04/04/2010, 01h29
  2. event onunload et postback
    Par mapmip dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/03/2009, 19h58
  3. [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
  4. Réponses: 4
    Dernier message: 21/05/2004, 09h13
  5. Accès à une case d'un DBGrid dans l'event OnKeyDown
    Par fba dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/03/2004, 12h48

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