asp.net
  • gridview
  • templatefield
  • rowcommand
  • 2009-11-03 6 views 2 likes 
    2
    <asp:TemplateField>  
        <ItemTemplate> 
         <table width="540" cellpadding="5"> 
         <tr> 
          <td align="left" style="width:60%;"> 
           <img src='PurchaseHandler.ashx?ProductID=<%# Eval("ProductID")%>' 
            alt="<%# Eval("ProductName") %>" /> 
          </td> 
          <td align="left"> 
           <h3 style="text-align:left;"> 
            <asp:Label ID="nameLabel" runat="server" 
             Text='<%# Eval("ProductName") %>' /> 
           </h3> 
           <asp:Label ID="priceLabel" runat="server" Text='<%# Eval("Price") %>' /> 
           <br /> 
           <asp:LinkButton ID="cartLink" runat="server" Text="<b>Add to Cart</b>" 
            CommandName="Add" CommandArgument='<%# Eval("ProductID") %>' /> 
          </td> 
         </tr> 
         </table> 
        </ItemTemplate> 
    </asp:TemplateField> 
    

    J'utilise un objet métier de panier qui contient des champs non utilisés pour l'affichage dans GridView. Ce que j'essaie de faire ensuite dans le gestionnaire d'événements RowCommand est de récupérer le reste des champs de données de la ligne sélectionnée. Cela me donne l'ID de produit correct à partir de la ligne sélectionnée:GridView Template - Comment saisir des données de la ligne sélectionnée

    if (e.CommandName == "Add") 
    { 
        int productID = 0; 
        int.TryParse(e.CommandArgument as string, out productID); 
    
        // Big blank! 
    } 
    

    Comment puis-je saisir le reste des champs de données de la ligne sélectionnée pour remplir mon panier? À titre d'explication, je peux probablement utiliser le productID pour creuser dans le DataSet tiré de l'état de Session, et obtenir les données de cette façon. Cependant, ce que j'essaye de déterminer est s'il y a une syntaxe semblable à ceci qui peut être employée dans cette situation?

    DataRow[] rows = ds.Tables[0].Select("ProductID=" + 
            gridProducts.SelectedDataKey.Values["ProductID"].ToString()); 
    DataRow row = rows[0]; 
    

    Répondre

    5

    Une façon de le faire serait d'utiliser l'argument de commande pour stocker l'index de ligne (il peut-être mise en événement créé sur la ligne).

    Vous pouvez ensuite utiliser le code comme ci-dessous pour accéder à votre ligne (code snipped de MSDN):

    // Convert the row index stored in the CommandArgument 
        // property to an Integer. 
        int index = Convert.ToInt32(e.CommandArgument); 
    
        // Retrieve the row that contains the button clicked 
        // by the user from the Rows collection. Use the 
        // CommandSource property to access the GridView control. 
        GridView customersGridView = (GridView)e.CommandSource; 
        GridViewRow row = customersGridView.Rows[index]; 
    

    Si vous devez garder votre argument de commande comme l'identifiant du produit, vous pouvez utiliser le code ci-dessous pour accéder la ligne:

    GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer); 
    

    vous pouvez ensuite utiliser la méthode FindControl() du GridViewRow pour sélectionner les commandes dont vous avez besoin.

    Label priceLabel = row.FindControl("priceLabel") as Label; 
    

    Modifier après les commentaires de OP

    Donc, si je ne me trompe pas, vous voulez accéder à la DataItem de votre ligne?

    Je ne pense pas que ce soit possible dans un gestionnaire d'événements RowCommand - je l'ai fait un peu de creuser sur d'autres forums et apparemment cette propriété est non nulle pendant DataBind - MSDN a this dire:

    La propriété DataItem est disponible uniquement pendant et après l'événement RowDataBound d'un contrôle GridView.

    On dirait que votre méthode ou quelque chose de similaire est la seule façon de relier de nouveau aux objets originaux du RowCommand (espérons que quelqu'un me donne tort)

    +0

    Salut David, Merci pour vos commentaires. J'ai édité la question pour expliquer plus loin que c'est l'autre, les champs de non-affichage, dans le DataSet que je suis après. Je peux y accéder en utilisant le productID que j'ai déjà obtenu. Cependant, quelque chose me dit qu'il y a une approche plus élégante à cela ... TemplateFields me confond toujours quand dans ce type de scénario. Anthony :-) – IrishChieftain

    +0

    Merci David, Voilà la réponse! J'ai été en mesure d'obtenir les données directement à partir du DataSet. Anthony :-) – IrishChieftain

    +0

    Pour le bénéfice des autres, j'ai obtenu l'index de la ligne sélectionnée en bouclant à travers les lignes de table du DataSet pour obtenir une correspondance sur le productID obtenu plus tôt. Ensuite, j'ai eu accès au reste des données. – IrishChieftain

    Questions connexes