我有一个GridView,我将数据源从SQL数据库绑定到它,网格有一个带有复选框的列,所以我可以“选择”其中的一些项目(实际上是行)。我想要的是在每个选定的行中对Item进行一些更新,但在一些搜索后我找不到如何访问一行中的Item,虽然DataItem可以工作,但它给了我一个Null。
编辑:为了简化,我有一个从DataSource构建的GridView,所以基本上,每行代表一个Object,当我在其中一行中选中了复选框时,我希望能够获取与该行相关的对象,实现该目标的最简单方法是什么?
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,然后向我的数据库发出SQL请求,但它似乎有点沉重,必须有更好的解决方案。
答案 0 :(得分:3)
除非您在数据绑定完成后将数据源存储在ViewState或会话中,否则会丢失数据源。除非您这样做,否则DataItem将始终为null。因此,我经常发现自己将数据源存储在视图状态。当然,这意味着您的页面大小会变得更大。您所说的另一个选项是使用某种主键重新查询数据源。根据您的需要,我不能说哪个选项更好。我倾向于倾向于视图状态而不是第二个DB调用,因为这可能是一个昂贵的调用
答案 1 :(得分:2)
鉴于您AutoPostBack
上的asp:checkbox
设置为true,您必须在设置复选框时更新该行
因此,我建议您在名为OnCheckedChanged="chkStatus_OnCheckedChanged"
的{{1}}上设置事件asp:checkbox
,然后您只能更新所选行,而不必遍历enitre网格。< / p>
以下是如何获取所选复选框的行项目的示例
chkSelect