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

これを行う 1 つの方法は、コマンド引数を使用して行インデックスを格納することです (おそらく 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 イベント ハンドラー内でこれが可能だとは思わない - 他のフォーラムで少し掘り下げたが、どうやらこのプロパティはその間だけ null ではないDataBind- MSDN はのように述べている:

DataItem プロパティは、GridView コントロールの RowDataBound イベント中およびイベント後にのみ使用できます。

あなたの方法または類似の方法が、RowCommand の元のオブジェクトにリンクする唯一の方法であるように見えます (誰かが私が間違っていることを証明してくれることを願っています)

于 2009-11-03T04:07:26.083 に答える