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 :

Ajout de lignes dans DataGrid


Sujet :

ASP.NET

  1. #1
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut Ajout de lignes dans DataGrid
    Bonjour à tous,

    je viens à vous car je suis confronté à un problème dont je ne parviens pas à me sortir.

    Je construis une page dans laquelle un user peut répondre à des offres d'emploi. Pour cela, il dispose d'un formulaire en plusieurs étapes (asp:wizard) et doit donner plusieurs informations dont les langues qu'il parle.

    Pour ce faire, dans un modal popup, j'ai deux dropdownlist (1 pour la langue et une pour le niveau) et un datagrid. Le but étant de peupler le datagrid chaque fois qu'un enregistrement est ajouté.
    Cela ne me pose pas de problème quand le user a déjà crée sa candidature est qu'il la modifie car je dispose d'un ID et peut travailler avec ma BDD.

    Par contre, lorsqu'il s'agit d'une création, je dois attendre que la création de la candidature ait eu lieu pour créer les liens candidature-langue-niveau en base. Or je ne parviens pas à stocker les paires langue-niveau.

    Un peu de code pour illustrer:

    les ddl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <table>
    <tr>
    <td class="Titre4"><asp:DropDownList runat="server" ID="DDLLangue" Width="200px" AutoPostBack="false" EnableViewState="true"></asp:DropDownList></td>
    </tr>
    <tr>
    <td><asp:DropDownList runat="server" ID="DDLNiveau" AutoPostBack="false" Width="200px" EnableViewState="true"></asp:DropDownList></td>
    </tr>
    </table>
    le datagrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <asp:DataGrid runat="server" ID="DGLangue" AutoGenerateColumns="false" >
    <Columns> 
      <asp:BoundColumnDataField="LAN_ID"  />
     <asp:BoundColumnDataField="LAN_LIB" />
    <asp:BoundColumn DataField="NIV_LIB" />                               
    </Columns>
    </asp:DataGrid>
    Enfin, un bouton valider doit me permettre d'afficher le contenu des ddl dans le datagrid.

    Comment pourrais-je proceder? J'ai pensé utiliser un tableau dans lequel je stocke les valeurs des ddl et que je stocke en session pour ensuite boucler dessus mais je ne vois pas comment procéder.

    D'avance merci

  2. #2
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Bonjour,
    Si j'ai bien compris, tu veux que lorsque l'utilisateur clique sur valider, insérer dans le datagrid les valeurs qui il'a choisi dans DDL avant de les insérer dans la Base de données ????

  3. #3
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Exactement, c'est tout à fait ce que je veux faire.
    Je dois donc stocker les deux données issues des DDL et m'en servir pour peupler le datagrid.
    Aprés quoi je pourrai les insérer en base

  4. #4
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Voici ma solution que je peux te proposer. je l'ai testé et ca marche très bien.

    TU déclare un DataTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             Private dt As DataTable
    et tu lui rajoute tes 3 colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            dt = New DataTable
            dt.Columns.Add("LAN_ID")
            dt.Columns.Add("LAN_LIB")
            dt.Columns.Add("NIV_LIB")
    Dans le boutton valider, tu va déclarer un datarow qui va te rajouter une nouvelle ligne. Le Datarow va récuprer les valeur des combos. Pour la première colonnes j'ai mis le nombre de ligne que ta dans le datagrid + 1.
    et tu fait un Databind pour que le résultat s'affiche dans le datagrid.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            Dim myDataRow As DataRow
            myDataRow = dt.NewRow()
            myDataRow("LAN_ID") = DGLangue.Items.Count + 1
            myDataRow("LAN_LIB") = DDLLangue.SelectedValue
            myDataRow("NIV_LIB") = DDLNiveau.SelectedValue
            dt.Rows.Add(myDataRow)
     
            DGLangue.DataSource = dt
            DGLangue.DataBind()
    j'espère que ceci va t'aider. bon courage

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Merci pour ton aide, ce que tu me proposes fonctionne effectivement au premier clic sur le bouton valider.
    PAR CONTRE, au second clic, c'est a dire si le user choisit une nouvelle langue, alors la row précédemment insérée est supprimée et remplacée par la nouvelle.

    Je ne comprend plus pourquoi cette ligne ne reste plus et pourquoi elle est systématiquement remplacée.

  6. #6
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Dans le Load de ta page

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If Not Page.IsPostBack Then
     
                dt = New DataTable
                dt.Columns.Add("LAN_ID")
                dt.Columns.Add("LAN_LIB")
                dt.Columns.Add("NIV_LIB")
                viewstate("dt") = dt
            End If
    Dans le boutton valider met ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       Dim myDataRow As DataRow
            dt = CType(viewstate("dt"), DataTable)
            myDataRow = dt.NewRow()
            myDataRow("LAN_ID") = DGLangue.Items.Count + 1
            myDataRow("LAN_LIB") = DDLLangue.SelectedValue
            myDataRow("NIV_LIB") = DDLNiveau.SelectedValue
            dt.Rows.Add(myDataRow)
            viewstate("dt") = dt
            DGLangue.DataSource = dt
            DGLangue.DataBind(
    ca marche très bien là

  7. #7
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Merci beaucoup

    Je suis une buse... 20min que je cherche comment faire et je n'ai même pas pensé à stocker le dt dans le viewstate...

    Maintenant se pose un autre soucis:
    exemple:
    - au 1er clic sur valider, le user choisit Anglais - Courant
    - au 2nd clic sur valider, il choisit Anglais - Moyen
    Dans ce cas, je ne dois pas ajouter la ligne mais la remplacer.

    Je pourrai procéder comme pour le dt en stockant dans le viewstate, mais y a t'il une solution qui me permettrait de récupérer les valeurs déjà stockées dans le datagrid et de vérifier que la langue n'a pas déjà été choisie. Si elle l'a déjà été, comment ne mettre que le niveau a jour ?

    Merci encore pour ton aide.

  8. #8
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Tiens cella, j'espère que ca marcherait :


    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
      Dim myDataRow As DataRow
            Dim trouve As Boolean = False
            dt = CType(viewstate("dt"), DataTable)
            myDataRow = dt.NewRow()
     
            For i As Integer = 0 To dt.Rows.Count - 1
     
                If dt.Rows(i).Item(1) = DDLLangue.SelectedValue Then
                    dt.Rows(i).Item(2) = DDLNiveau.SelectedValue
                    trouve = True
                End If
     
            Next
     
            If trouve = False Then
                myDataRow("LAN_ID") = DGLangue.Items.Count + 1
                myDataRow("LAN_LIB") = DDLLangue.SelectedValue
                myDataRow("NIV_LIB") = DDLNiveau.SelectedValue
            End If
     
            viewstate("dt") = dt
            DGLangue.DataSource = dt
            DGLangue.DataBind()

  9. #9
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Quand ça ne veut pas, ça ne veut pas.

    La solution que tu me donnes fonctionne effectivement. MAIS, pour ce faire, il faut que enableViewstate soit à False sur le DataGrid.
    Or, si c'est le cas, je perds les lignes à chaque rechargement de l'updatepanel.

    Je pense que la solution pourrait consister à stocker les ddl.SelectedValue(s) dans un tableau, à le stocker dans le viewstate puis à la parcourir pour peupler le datagrid a chaque chargement mais je suis un ignare et je ne sais pas comment ajouter des éléments à un tableau bidimensionnel puis le parcourir ensuite.

  10. #10
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Normalement avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            DGLangue.DataSource = dt
            DGLangue.DataBind()
    ca va pas te poser problème. j'ai testé et ca marche pour moi. j'ai pas trop compris pourquoi tu as problème du enableviewstate ??,

  11. #11
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Je ne comprend plus non plus.
    Quand tu dis que ta methode fonctionne, tu veux bien dire que tu peux ajouter de nouvelles lignes au datagrid et modifier le niveau dans une langue si celle ci existait déjà ?

    Pourrais tu me renvoyer ton code complet ou accepterais tu de jeter un coup d'oeil à mon code ?

  12. #12
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    ok vas y envoi moi ton code pour que je puisse le voir.

  13. #13
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    C'est dans tes MP.

    Merci pour ton aide

  14. #14
    Membre éclairé Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Par défaut
    Dans ton code, y'a des lignes qui sont inutiles qui vont te prendre du temps pour rien. A ta place j'aurais procédé comme suit :

    Dans le 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 Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            If Not Page.IsPostBack Then
                dt = New DataTable
                dt.Columns.Add("LAN_ID")
                dt.Columns.Add("LAN_LIB")
                dt.Columns.Add("NIV_LIB")
                viewstate("dt") = dt
            End If
     
        End Sub
    Dans le bouton valider :

    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
        Private Sub Valider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
     
            Dim dt As New DataTable 'datatable pour peupler datagrid
            Dim myDataRow As DataRow 'Lignes du datatable
            Dim ExisteDeja As Boolean = False 'sert à vérifier la présence d'une langue dans le datagrid
     
            If Not Request.QueryString("IdCandidature") Is Nothing Then
                EnregistrerLienLangueNiveau()
            Else
     
                dt = CType(ViewState("dt"), DataTable)
                'test pour déterminer si la langue choisie dans la ddl existe déjà dans le datagrid.
                For i As Integer = 0 To dt.Rows.Count - 1
                    'si la langue a déjà été choisie on ne fait que modifier le niveau
                    If dt.Rows(i).Item(0) = DDLLangue.SelectedValue Then
                        dt.Rows(i).Item(1) = DDLNiveau.SelectedValue
                        dt.Rows(i).Item(3) = DDLNiveau.SelectedItem.Text
                        ExisteDeja = True
                    End If
                Next
     
                'Si la langue n'était pas présente dans le datagrid, on crée la ligne complète
                If ExisteDeja = False Then
                    myDataRow = dt.NewRow()
                    myDataRow("LAN_ID") = DDLLangue.SelectedValue
                    myDataRow("NIV_ID") = DDLNiveau.SelectedValue
                    myDataRow("LAN_LIB") = DDLLangue.SelectedItem.Text
                    myDataRow("NIV_LIB") = DDLNiveau.SelectedItem.Text
                    dt.Rows.Add(myDataRow)
                End If
     
                ViewState("dt") = dt
     
                DGLangue.DataSource = dt
                DGLangue.DataBind()
     
                Dim Ab As Integer = 0
                Dim Ord As Integer = 0
                Dim Tableau(Ab, Ord) As String
                dt = CType(ViewState("dt"), DataTable)
     
            End If
     
        End Sub

    Je pense que là est optimisé, le code est clair et y'a moins de lignes.
    Sinon, je comprend pas pkoi ta rajouté ces lignes là a la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
               Dim Ab As Integer = 0
                Dim Ord As Integer = 0
                Dim Tableau(Ab, Ord) As String
                dt = CType(ViewState("dt"), DataTable)
    Elles contiennent que des déclarations. Sinon j'espère que ca va marcher cette fois-ci. Bon courage

  15. #15
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Merci mille fois pour ton aide.
    Je n'avais pas eu le temps de tester hier, je l'ai fait ce matin à la première heure et cela fonctionne niquel.

    J'ai compris où j'avais merdé: je reconstruisais le datatable à chaque appel de valider_click.

    Effectivement tu as bien epuré le code qui, à force de modifier et de tester avait fini par etre illisible.
    Quant aux dernière lignes, il s'agissait d'un test qui ne fonctionnait pas .

    Merci encore

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

Discussions similaires

  1. Ajouter des lignes dans un datagrid
    Par gibea00 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/07/2007, 13h20
  2. Événement d'ajout de ligne dans un Datagrid!
    Par Jean_dick15 dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/05/2007, 17h17
  3. [1.1] Ajouter une ligne dans un dataGrid
    Par Khrysby dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/02/2007, 13h36
  4. [Datagrid]:Ajout de ligne dans mon datagrid
    Par shirya dans le forum ASP.NET
    Réponses: 6
    Dernier message: 29/01/2007, 17h52
  5. [.NET] [C#] - Empecher l'ajout de ligne dans datagrid
    Par fab2050 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/11/2005, 19h12

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