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 :

Plusieurs TextBox lié à plusieurs objet


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Plusieurs TextBox lié à plusieurs objet
    Bonjour,
    Je suis habituellement développeur Java/Struts et je découvre .net 2.0 C# avec visual studio 2005.

    J'ai une liste d'articles, pour chacun de ces articles, je voudrais présenter une Textbox qui permette de saisir la quantité de cet article à commander.
    Pour le moment j'y suis arrivé comme ceci :
    Dans le Page_Load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach (syaka.Article article in this.type.Articles)
            {
                TextBox t = new TextBox();
                t.ID = "quantite[" + article.Id + "]";
                t.Columns = 2;
                t.Visible = true;
                t.Enabled = true;
                t.Text = "0";
                StaticReferences.debug("try to add "+article+" = "+t);
                quantites.Add(article, t);
                Form.Controls.Add(t);
            }
    Et au click du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(syaka.Article article in this.type.Articles)
            {// Débug dans un fichier de log pour voir ce qui est passé
                StaticReferences.debug("quantite d'article "+article.Id+" = "+this.quantites[article].Text);
            }
    Je ne sais même pas si c'est une bonne solution mais voilà ce qui m'embête dans cette solution c'est comment en plus d'afficher les TextBoxs, je vais pouvoir ajouter de l'HTML dans mon formulaire et faire en sorte de bien placer les TextBoxs ?
    Pour chacun des articles je devrais normalement créer un <tr> et afficher des informations contenue dans l'objet syakaArticle.

    J'ai bien penser à la place de Form.Controls.Add essayer de l'écrire moi même du côté ASP dans un foreach mais dans ce cas, la valeur récupérer reste tjs 0.

    Je me doute que ce genre de problème arrive souvent et je cherche LA solution ASP pour ce genre de problème. N'ayez crainte de me faire tout refaire, je voudrais vraiment connaître la BONNE façon.

    D'avance merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    J'oubliais de préciser que quand je fais "quantites.Add(article, t);", c'est pour remplir un dictionnaire où à la clé article je stock mon objet textBox.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    En parcourrant les formus, j'ai essayé cette approche mais je coince sur autre chose :
    Au Page_Load je prépare toujours mon Dictionary<Article,TextBox>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            quantites.Clear();
            foreach (syaka.Article article in this.type.Articles)
            {
                TextBox t = new TextBox();
                t.ID = "quantite[" + article.Id + "]";
                t.Columns = 2;
                t.Visible = true;
                t.Enabled = true;
                t.Text = "0";
                quantites.Add(article, t);
            }
    Et dans le code ASP :
    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
     
                    <%
                    foreach (syaka.Article article in type.Articles)
                    {
                        quantitePh.Controls.Add(quantites[article]);
                        %>
                            <tr>
                                <td>
                                    proprietes
                                </td>
                                <td>
                                    <asp:PlaceHolder ID="quantitePh" runat="server" />
                                </td>
                            </tr>
                        <%
                        quantitePh.Controls.Remove(quantites[article]);
                    }
                    %>
    J'utilise un placeHolder auquel j'ajoute dynamiquement mon objet TextBox mais mon problème est alors que quand j'arrive dans mon action ajouter au panier (au OnClick de mon asp:Button), les valeurs des mes TextBox ne sont pas passée.

    Quelqu'un connait-il le moyen de dire au formulaire qu'il doit prendre en compte mes TextBox sans devoir faire Form.Controls.Add qui lui m'empêche de faire une boucle foreach du côté ASP en me disant que si je veux faire du dynamique je dois tout faire côté c# sans une seule "<%%>".

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Je suis étonné que personne ne réponde à cette question.
    Si quelqu'un est dans le même cas que moi, voici la solution que j'ai mis en place :
    Du côté ASP :
    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
     
    <form id="serverForm" runat="server">
      <div>
        <table>
        <%
                    foreach (syaka.Article article in type.Articles)
                    {
                        // Je set l'id du TextBox que je vais créer
                        quantite.ID = "quantite[" + article.Id + "]";
                        %>
                            <tr>
                                <td>
                                    proprietes
                                </td>
                                <td>
                                    <asp:TextBox ID="quantite" runat="server" Columns="2" Text="0"/>
                                </td>
                            </tr>
                        <%
                    }
        %>
        </table>
          <asp:Button ID="Ajouter" runat="server" Text="Ajouter au panier" OnClick="AjouterPanier" />
      </div>
    </form>
    Ca ne me parraît pas très propre de définir un ID manuellement comme ça mais ça a le mérite de fonctionner.
    Etant donné que je n'ai qu'un TextBox nommé quantité enregistré dans le formulaire, je suis obligé du côté code-behind de retrouver mes valeurs dans la requête :
    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
     
    protected void AjouterPanier(object sender, EventArgs e)
        {
     
            foreach(syaka.Article article in this.type.Articles)
            {
                int quantite = Int32.Parse(findTextBox("quantite[" + article.Id + "]"));
                if (quantite > 0)
                {
                    panier.Add(article, quantite);
                }
                StaticReferences.debug("quantite d'article "+article.Id+" = "+quantite);
     
            }
            Response.Redirect("Default.aspx");
        }
     
        private string findTextBox(string requestFormId)
        {
            foreach (string k in Request.Form.Keys)
            {
                if (k.EndsWith(requestFormId))
                {
                    return Request.Form[k];
                }
            }
            return null;
        }

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    N'y a-t-il pas moyen dans l'asp de dire je voudrais dessiner le contrôle foo maintenant ici.

    J'ai regarder un peu du côté de Control.RenderControl() mais je n'arrive à rien.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 619
    Points
    1 619
    Par défaut
    utilise un repeater.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Euhh est-ce que ça veut dire que je dois redesigner toute mon application ???
    T'aurais pas un exemple concret ?

    Pour le moment, au Page_Load, je prépare un bean immuable qui correspond à ce qu'il y'a dans ma DB.

    Mais comme je vois l'affaire, il faudrait plutôt que je crée une DataSource qui va vers quoi alors ? mon DAO ? enfin une méthode de mon DAO je suppose.

    Y'a vraiment pas moyen de faire plus simple et de parcourrir une collection ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Alors j'ai avancé mais j'en suis pas encore très loin.

    J'ai bien fait une DataSource sur mon DAO qui doit être un objet dont le constructeur ne prend aucun argument.
    Cet objet contient une méthode getArticles(int typeId) et je reçois le typeId en request.Param et elle retourne une List<Article>.

    Dans mon repeater, j'ai donc le bon nombre de ligne et je peux demander dans un <ItemTemplate> de me dessiner un TextBox par exemple.

    Du coup du côté ASPX.CS, au click de mon bouton, je prends mes Repeater1.Items pour obtenir toutes les valeurs de mes TextBoxs. Première question pourquoi est ce que dans ma boucle :
    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
     
     
    		foreach(RepeaterItem ri in Repeater1.Items)
    		{
    			TextBox tb =null;
    			foreach (Control c in ri.Controls)
    			{
    				if (c is TextBox)
    				{
    					tb = (TextBox)c;
    				}
    			}
    			StaticReferences.debug(ri.DataItem + " = " + tb.Text);
     
    		}
    Pourquoi est-ce que ri.DataItem est toujours Null je croyais que c'était là que j'allais récupéré mon objet Article.

    Deuxième question, à l'intérieur de mon objet Article, j'ai une List<Propriete>. Comment accéder à cet objet à l'intérieur de mon <ItemTemplate> ?

Discussions similaires

  1. Intégration de plusieurs cellules vers plusieurs textbox
    Par lea133 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/07/2013, 17h35
  2. Concaténation de plusieurs champs dans un objet
    Par bastoonet dans le forum Débuter
    Réponses: 3
    Dernier message: 27/09/2006, 11h13
  3. [C++.NET]RAZ de plusieurs textbox
    Par lowrider dans le forum MFC
    Réponses: 11
    Dernier message: 06/05/2006, 07h41
  4. Réponses: 2
    Dernier message: 15/03/2006, 18h48
  5. Plusieurs clés dans un objet session
    Par maxos75 dans le forum ASP
    Réponses: 4
    Dernier message: 22/12/2005, 16h14

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