GridView模板 - 如何从所选行中获取数据

时间:2009-11-03 03:27:23

标签: asp.net gridview templatefield rowcommand

<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>

我正在使用购物车业务对象,其中包含未在GridView中显示的字段。我在RowCommand事件处理程序中尝试接下来要做的是从所选行中检索其余的数据字段。这为我提供了所选行中正确的产品ID:

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

    // Big blank!
}

如何从所选行中获取剩余的数据字段以填充我的购物车?通过解释,我可以使用productID挖掘从Session状态拉出的DataSet,并以这种方式获取数据。但是,我想要确定的是,是否存在类似于此的语法,可以在这种情况下使用?

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

1 个答案:

答案 0 :(得分:5)

执行此操作的一种方法是使用command参数存储行索引(可能将其设置在on row created事件中)。

然后,您可以使用以下代码访问您的行(代码剪切自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];

如果您需要将命令参数保留为产品ID,则可以使用以下代码访问该行:

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

然后,您可以使用GridViewRow的FindControl()方法选择所需的控件。

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

在OP发表评论后进行修改

所以,如果我是正确的,你想要访问你的行的DataItem吗?

我认为这在RowCommand事件处理程序中是不可能的 - 我在其他论坛上做了一些挖掘,显然这个属性在DataBind期间只是不为空 - MSDN有this到说:

  

DataItem属性仅在GridView控件的RowDataBound事件期间和之后可用。

看起来你的方法或类似的东西是链接回RowCommand中原始对象的唯一方法(希望有人证明我错了)