none
Recuperer la valeur d'un Textbox contenu dans un DataGridView RRS feed

  • Question

  • Bonjour,
    Tout d'abord, une petit présentation de ce que j'ai et ce que je souhaite:
    Dans le projet web, j'ai un formulaire qui doit permettre le passage de commandes de "produits".
    Pour cela j'affiche d'abord les produits dans un DataGridView que j'ai récupéré préalablement dans une base de données. Dois-je préciser que j'utilise LINQ to SQL et que cela est fait dynamiquement? Cela fonctionne parfaitement (si besoin je vous donnerais le code que la requete LINQ).

    Ensuite, Je veux pouvoir passer la commande d'un des produits du DataGridView, j'ai donc rajouter deux colonnes: Une qui permet de définir la quantité de produits que l'on veut  (un textbox), l'autre un bouton "ajouter" permettant d'ajouter la commande de ce produit à son panier.

    Mon soucis est que, quand je clic sur un bouton "ajouter", je n'arrive pas à récuperer la quantité contenu dans le textbox de la même ligne.
    J'ai pas mal rechercher et j'ai fini par trouver la méthode Findcontrol( "IdDuTextBox") et ensuite j'utilise un For each/next pour parcourir toutes les lignes de mon datagrid et récuperer ainsi la valeur "Des" textbox.
    Cependant, je ne trouve pas cette façon de procéder correcte. J'aimerais pouvoir récuperer directement la valeur du textbox assigné à la même ligne que le bouton sur lequel j'ai cliqué.

    C'est un peu embrouillé? Pour vous aider à comprendre voici mon code:

    ASP:
     <asp:GridView ID="GrdCatalog" runat="server"  CssClass="CssGridView" 
            AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Reference">
            <Columns>
    <asp:BoundField DataField="Reference" />
    <asp:BoundField DataField="Description"  />
    <asp:BoundField DataField="Make"  />
    <asp:BoundField DataField="Prix"  />
    <asp:TemplateField  >
        <ItemTemplate>
            <asp:TextBox ID="TxtQuantite" runat="server" Width="70"></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="Disponible"  />
    <asp:TemplateField>
        <ItemTemplate>
            <asp:Button ID="BtnAjouterPanier" runat="server" 
                CommandArgument='<%# eval("Reference") %>' CssClass="CssButton" 
                Font-Bold="True" Font-Size="Larger" oncommand="AjouterAuPanier" Text="+" 
                Width="25" />
        </ItemTemplate>
    </asp:TemplateField>
            </Columns>
            </asp:GridView>    

    Behind:


    'Procédure lié au clic sur un des boutons "ajouter"
        Protected Sub AjouterAuPanier(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
    
            'Récupération de l’Id de l’annonce dans le paramètre de commande de l’évènement
            Dim Reference As String = CType(e.CommandArgument, String)
            Dim quantite As New TextBox
            Dim tb As TextBox
    
            quantite.Text = ""
    
            For Each row As GridViewRow In GrdCatalog.Rows
                tb = row.FindControl("TxtQuantite")
                If tb.text <> "" Then
                    quantite = tb
                End If
            Next
    
    If quantite.Text <> "" Then
                If IsNumeric(quantite.Text) Then
                    Dim db As New SQLDataClasses1DataContext
    
                    Dim myBasket As New Basket With _
                    {.Login = "admin", _
                    .ItemNo = Reference, _
                    .Quantity = quantite.Text}
                    db.Basket.InsertOnSubmit(myBasket)
                    db.SubmitChanges()
                Else
                End If
            Else
    
            End If
    
    
    
    
        End Sub
    Merci d'avance pour vos réponses.
    vendredi 30 octobre 2009 14:12

Réponses

  • Bonjour, 
    Plutôt que de spécifier dans votre CommandArgument la référence de votre produit, vous pouvez spécifier la ligne du tableau. Dans ce cas, dans votre handler vous pourrez retrouver la GridRow et donc par conséquent retrouver la référence de votre produit et la TextBox :

    Protected Sub AjouterAuPanier(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
      Dim index as Integer = ConvertTo.Int32(e.CommandArgument)
      Dim row as GriwViewRow = DirectCast(e.CommandSource, GridView).Rows(index)
    
      Dim tb = row.FindControl("TxtQuantite")
      '...
    End Sub



    Guillaume Rouchon - Mon blog : http://blog.qetza.net
    vendredi 30 octobre 2009 17:02

Toutes les réponses

  • Bonjour, 
    Plutôt que de spécifier dans votre CommandArgument la référence de votre produit, vous pouvez spécifier la ligne du tableau. Dans ce cas, dans votre handler vous pourrez retrouver la GridRow et donc par conséquent retrouver la référence de votre produit et la TextBox :

    Protected Sub AjouterAuPanier(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
      Dim index as Integer = ConvertTo.Int32(e.CommandArgument)
      Dim row as GriwViewRow = DirectCast(e.CommandSource, GridView).Rows(index)
    
      Dim tb = row.FindControl("TxtQuantite")
      '...
    End Sub



    Guillaume Rouchon - Mon blog : http://blog.qetza.net
    vendredi 30 octobre 2009 17:02
  • Merci beaucoup, c'est tellement simple que je n'y ai pas pensé.
    Je teste cela demain.

    Bonne soirée.
    lundi 2 novembre 2009 17:22