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 :

Ajouter un input dans une gridview


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 22
    Points
    22
    Par défaut Ajouter un input dans une gridview
    Bonjour à tous !!

    J'ai quelques problèmes pour personnaliser une gridview et j'aurais besoin d'un peu d'aide. Je récupére d'un connector de ma confection une datatable que j'affiche dans une griview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <asp:GridView ID="gridcommand" runat="server" AllowPaging="True" 
                onpageindexchanging="gridcommand_PageIndexChanging" 
                onselectedindexchanging="gridcommand_SelectedIndexChanging" 
                onselectedindexchanged="gridcommand_SelectedIndexChanged">  
    </asp:GridView>
    Jusque là facile j'ai suivi quelques tutos et c'est tout bon.
    ça se corse pour moi parce qu'on me demande d'ajouter une colonne à la gridview afin de pouvoir saisir une quantité pour chacune des lignes et récupérer le tout après validation de la page.

    J'ai bien penser à faire un truc à l'arrache avec une boucle et un bon vieux tableau html, mais j'aimerais bien utiliser un truc un peu plus classe à la .NET mais je n'arrive à rien.

    J'ai commencé par ajoute une colonne contenant un input html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    System.Data.DataColumn test = new DataColumn("Qté", typeof(String));
    test.DefaultValue = "<input type=\"text\" runat=\"server\" id=\"txtName\">";
    dt.Columns.Add(test);
    DataView dv = new DataView(dt);
    gridcommand.DataSource = dv;
    // Make the grid databoud.
    gridcommand.DataBind();
    Le code html s'affiche en clair dans la gridview !

    J'ai ensuite essayé d'ajouter une colonne contenant un input C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    System.Data.DataColumn test = new DataColumn("Qté", typeof(Object));
    System.Web.UI.HtmlControls.HtmlInputText monInput = new System.Web.UI.HtmlControls.HtmlInputText();
    test.DefaultValue = monInput;
    dt.Columns.Add(test);
    DataView dv = new DataView(dt);
    gridcommand.DataSource = dv;
    // Make the grid databoud.
    gridcommand.DataBind();
    Cette fois-ci la colonne n'apparait même plus dans la dv et donc dans la gridview !


    Merci d'avance de m'éclairer un peu :
    - Ma demande est-elle réalisable (Je n'imagine pas le contraire !) ?
    - mon approche est-elle la bonne (Il semble que non !)?

    Avez-vous déjà fais ce genre de chose, avez-vous des exemples concrets ou de bons tutos à suivre ?

    Bonne soirée
    Stéphane

  2. #2
    Expert confirmé
    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 : 40
    Localisation : France

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

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

    Tu peux soit rajouter l'input pour la saisie en mode édition et donc utiliser un EditItemTemplate ( et rendre visible les boutons Edit, Cancel et Save).

    Ou bien, tu peux utiliser simplement un ItemTemplate pour insérer ton input, et ajouter un bouton hors de la GridView qui te permettra d'enregistrer toutes les lignes en même temps.

    En espérant t'avoir aidé.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 22
    Points
    22
    Par défaut Mise à jour de ma datsource !
    Bonjour à tous !

    J'ai avancé un peu sur mon sujet, merci Nicolas pour ton aide. Voici donc désormais le code de ma gridview :
    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
     
    <asp:GridView ID="gridcommand" runat="server" AllowPaging="True" AutoGenerateColumns="False"
    OnRowEditing="gridcommand_RowEditing"
    OnRowCommand="gridcommand_RowCommand" 
    OnRowUpdating="gridcommand_RowUpdating" 
    onpageindexchanging="gridcommand_PageIndexChanging" 
    onselectedindexchanging="gridcommand_SelectedIndexChanging" Width="591px" ShowFooter="True">
    <RowStyle BorderColor="Black" BorderStyle="Inset" />
    <Columns>
    <asp:ButtonField Text="SingleClick" CommandName="SingleClick" Visible="False"/>
    <%--Id--%>
    <asp:TemplateField HeaderText="Code Article">
    <ItemTemplate>
    <asp:Label ID="monid" runat="server" Text='<%# Eval("id") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
     
    <%--Quantité--%>
    <asp:TemplateField HeaderText="Quantité Commandé">
    <ItemTemplate>
    <asp:TextBox ID="qtcmd" runat="server" Text='<%# Eval("qt") %>' OnTextChanged="TextChanged"></asp:TextBox>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    <HeaderStyle BackColor="#99CCFF" Font-Bold="True" />
    <AlternatingRowStyle BackColor="Silver" BorderColor="Black" />
    </asp:GridView>
    Je suis maintenant bloqué car je n'arrive pas à récupérer les valeurs saisies dans mes textbox !
    J'ai essayé d'utiliser la méthode "OnTextChanged" de mon textbox mais l'évènement semble ne jamais être déclenché. (la fonction doit bien être dans le codebehind n'est ce pas ?)

    D'autre part je ne sais pas comment stocker la datatable renvoyé par mon connector (Je n'utilise aucune base de données et je dois éviter d'en utiliser une !)
    J'ai utilisé le tuto suivant http://www.codeproject.com/KB/webfor...viewCells.aspx que j'ai essayé d'adapter à mon cas de figure, mais j'avoue que je patauge un peu.

    Merci d'avance de votre aide
    cordialement
    Stéphane

  4. #4
    Expert confirmé
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Je suis maintenant bloqué car je n'arrive pas à récupérer les valeurs saisies dans mes textbox !
    J'ai essayé d'utiliser la méthode "OnTextChanged" de mon textbox mais l'évènement semble ne jamais être déclenché. (la fonction doit bien être dans le codebehind n'est ce pas ?)
    Je vois que tu as choisis de ne pas utiliser le mode édition de la GridView et donc du EditItemTemplate. Il te faut donc un évènement pour indiquer que la saisie est terminée. Soit tu utilises un bouton Save, soit tu règles la propriété AutoPostBack à true pour ta TextBox (idéalement en utilisant en plus un UpdatePanel).

    D'autre part je ne sais pas comment stocker la datatable renvoyé par mon connector (Je n'utilise aucune base de données et je dois éviter d'en utiliser une !)
    Là je ne comprends pas trop ce que tu veux. Qu'entends tu par connector ? Tu as des données éditable dans ta GridView et tu souhaites les enregistrer, mais sans utiliser une base de données ? Dans ce cas tu peux utiliser des fichiers, ou du xml par exemple.

    En espérant t'avoir aidé.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Merci Nicolas pour ta réactivité !

    J'arrive à récupérer la valeur saisie grâce à ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected void TextChanged(object sender, EventArgs e)
            {
                TextBox montxtbox = (TextBox)sender;
                Text1.Value = montxtbox.Text;
            }
    Je n'ai pas encore trouvé comment récupérer l'index de l'enregistrement correspondant de mon datasource ?
    Qu'appelles-tu un updatePanel ?

    Pour ce qui de mon problème de données, en fait je développe une interface avec un système qui gère tous les accès BDD. J'appelle des fonctions qui me renvoi des dataTable que je passe en datasource à mon gridview. Les users peuvent alors modifier certaines données. Et je renvoi à la fin des modifications une dataTable via une méthode de mon connector à mon système distant.
    "Normalement" les dataTable ne sont pas sensé contenir trop d'infos, je pensais donc les stocker le temps de mes traitements dans une variable session comme dans le tuto que j'ai suivi :
    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
     
    /// <summary>
        /// Property to manage data
        /// </summary>
        private DataTable _sampleData
        {
            get
            {             
                DataTable dt = (DataTable)Session["TestData"];
     
                if (dt == null)
                {
                    // Create a DataTable and save it to session
                    dt = new DataTable();
     
                    dt.Columns.Add(new DataColumn("Id", typeof(int)));
                    dt.Columns.Add(new DataColumn("Description", typeof(string)));
                    dt.Columns.Add(new DataColumn("AssignedTo", typeof(string)));
                    dt.Columns.Add(new DataColumn("Status", typeof(string)));
                    dt.Columns.Add(new DataColumn("Tick", typeof(string)));
     
                    dt.Rows.Add(new object[] { 1, "Create a new project", "Declan", "Complete", true });
                    dt.Rows.Add(new object[] { 2, "Build a demo applcation", "Olive", "In Progress", false });
                    dt.Rows.Add(new object[] { 3, "Test the demo applcation", "Peter", "Pending", true });
                    dt.Rows.Add(new object[] { 4, "Deploy the demo applcation", "Andy", "Pending", false });
                    dt.Rows.Add(new object[] { 5, "Support the demo applcation", "", "Pending", true });
     
                    // Add the id column as a primary key
                    DataColumn[] keys = new DataColumn[1];
                    keys[0] = dt.Columns["id"];
                    dt.PrimaryKey = keys;
     
                    _sampleData = dt;
                }
     
                return dt;
            }
            set
            {
                Session["TestData"] = value;
            }
        }
    Initialisé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                _sampleData = null;
                this.GridView1.DataSource = _sampleData;
                this.GridView1.DataBind();
            }     
        }
    Je ne comprends pas bien comment se passe la persistance des données cotés serveur :
    - lorsque je valide un textbox de ma gridview je passe dans mon page_load et une fois la page rafraichie mon textbox contient toujours la valeur saisie alors que mon datasource n'est pas à jour.
    - Lorsque je valide mon formulaire et que j'essaye d'accéder coté codebehind à ma datasource, celle-ci est null.

    Je ne sais pas si mes explications sont très clair, mais je pense avoir besoin de quelques éclaircissements...

    Cdlt
    Stéphane

  6. #6
    Expert confirmé
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Citation Envoyé par smash Voir le message
    Je n'ai pas encore trouvé comment récupérer l'index de l'enregistrement correspondant de mon datasource ?
    Tu peux essayer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TextBox tb1 = ((TextBox)(sender)); 
    GridViewRow gv1 = ((GridViewRow)(tb1.NamingContainer));
     int rownumber =  gv1.rowindex;
    Citation Envoyé par smash Voir le message
    Qu'appelles-tu un updatePanel ?
    Là il s'agit d'utiliser Ajax en ASP.NET. Je t'invite à consulter la doc MSDN qui est très complète.

    Citation Envoyé par smash Voir le message
    Je ne comprends pas bien comment se passe la persistance des données cotés serveur :
    - lorsque je valide un textbox de ma gridview je passe dans mon page_load et une fois la page rafraichie mon textbox contient toujours la valeur saisie alors que mon datasource n'est pas à jour.
    - Lorsque je valide mon formulaire et que j'essaye d'accéder coté codebehind à ma datasource, celle-ci est null.
    Là tu abordes plusieurs sujets : les DataSources, la Session...
    Déjà dans la méthode Get de _sampleData tu initialises ta DataTable si elle n'est pas en Session, mais une fois fait tu ne la sauvegardes pas :-(
    Ensuite, les saisies de l'utilisateur dans les TextBox ne sont pas enregistrés dans ta DataTable car ce n'est pas géré automatiquement. A toi de les sauvegarder dans ta méthode TextChanged et donc via la méthode Set de _sampleData => de les persister dans ta Session.

    Pourquoi ne pas faire plus simple en utilisant une ObjectDataSource par exemple ? Cela te faciliterais grandement la tâche.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Me revoici avec mais problème de données !

    J'ai fait ceci pour alimenter ma gridview et conserver mes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Session["dt_donnees"] = dt_donnees.ToADODataTable();
    gridcommand.DataSource = Session["dt_donnees"];
    OnTextChanged sur mon textbox :
    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
     
    protected void TextChanged(object sender, EventArgs e)
    {
        TextBox inputModif = (TextBox)sender;
        GridViewRow gv1 = ((GridViewRow)(inputModif.NamingContainer));
        int rownumber = gv1.RowIndex;
     
        DataTable dt = (DataTable)(Session["dt_reappro_dispo"]);
        DataRow lg_recherche = dt.Rows[rownumber];
        if (Convert.ToInt32(lg_recherche.ItemArray[3]) >= Convert.ToInt32(inputModif.Text))
        {
            lg_recherche.BeginEdit();
            lg_recherche.ItemArray[4] = Convert.ToDecimal(inputModif.Text);
            lg_recherche.EndEdit();
            Session["dt_donnees"] = dt;
        }
        else
        { 
            inputModif.Text = "0";
            info_reappro.Text = "Vous ne pouvez pas commander plus de " 
                                + lg_recherche.ItemArray[3] 
                                + " unités.";
        }
    }
    Mon soucis c'est que ma modif n'est pas prise en compte dans l'element lg_recherche.ItemArray[4] comme s'il était en lecture seul. Je ne vois rien qui m'indique qu'il l'est.

    Quel est le problème ?

    Stéphane

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    J'ai fini par trouver la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dt.Rows[rownumber].BeginEdit();
    dt.Rows[rownumber][4] = Convert.ToDecimal(inputModif.Text);
    dt.Rows[rownumber].EndEdit();
    Si quelqu'un peut m'expliquer pourquoi la modification en utilisant le ItemArray[4] ne fonctionne pas je suis prenneur !

    @++

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

Discussions similaires

  1. Ajouter plusieurs input dans une seule div
    Par xKryckx dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/05/2015, 18h47
  2. Comment ajouter une ligne dans une gridview
    Par zmamovzki dans le forum ASP.NET
    Réponses: 6
    Dernier message: 01/08/2013, 14h36
  3. Ajouter des controles dans une gridview
    Par IAmByB dans le forum ASP.NET
    Réponses: 1
    Dernier message: 28/11/2012, 22h51
  4. Ajout d'un champ input dans un GridView
    Par manu f dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/06/2010, 17h21
  5. Ajout de ligne dans une datagrid ou gridview
    Par thierry007 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 16/11/2007, 09h23

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