SQL データベースから DataSource をバインドする GridView があります。グリッドにはチェックボックスのある列があり、その中のいくつかの項目 (実際には行) を「選択」できます。ここで必要なのは、選択した各行のアイテムを更新することですが、いくつかの検索の後、行内のアイテムにアクセスする方法が見つかりません。DataItem は機能すると思いますが、Null が返されます。
編集:短くするために、DataSource から構築された GridView があるため、基本的に、各行はオブジェクトを表し、行の 1 つでチェックボックスをオンにすると、関連するオブジェクトを取得できるようにしたいその行、それを達成する最も簡単な方法は何ですか?
Page_Load の DataBinding:
if (!Page.IsPostBack) { gvUnusedAccessories.DataSource = currentContext.Items.OfType<Accessory>().Where(ac => ac.Item_Parent_Id == ((PhoneLine)currentItem).Parent.Item_Id); gvUnusedAccessories.AutoGenerateColumns = false; gvUnusedAccessories.DataBind(); }
更新ボタンを押したときのイベントは、実際に行を参照し、行にチェックボックスがある場合は更新を行います:
protected void btnAddToMobile_Click(object sender, EventArgs e) { foreach (GridViewRow row in gvUnusedAccessories.Rows) { if(((CheckBox)row.FindControl("chkSelect")).Checked) { ((Accessory)row.DataItem).PhoneLine_Id = currentItem.Item_Id; } } }
そして、これが .aspx の私の GridView です:
<asp:GridView ID="gvUnusedAccessories" runat="server">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:TemplateField HeaderText="Select">
<ItemTemplate >
<asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="True"/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Item_Id" HeaderText="ID" ReadOnly="True"/>
<asp:BoundField DataField="Item_Name" HeaderText="Name" ReadOnly="True"/>
<asp:BoundField DataField="AccessoryModel" HeaderText="Modèle" ReadOnly="True"/>
<asp:BoundField DataField="AccessoryBrand" HeaderText="Marque" ReadOnly="True"/>
</Columns>
</asp:GridView>
行内に含まれるオブジェクトにアクセスする方法に関するヒントはありますか? 実際に ID を取得してから DB に SQL リクエストを実行できることはわかっていますが、少し重いようで、より良い解決策が必要です。