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>

我正在使用一个购物车业务对象,其中包含不用于在 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];
4

1 回答 1

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

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

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

OP评论后编辑

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

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

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

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

于 2009-11-03T04:07:26.083 回答