C# 从GridViewRow ASP.NET获取项目
我有一个GridView,我从SQL数据库将一个数据源绑定到它,网格中有一个带有复选框的列,因此我可以“选择”其中的一些项目(实际上是行)。我想在这里对每个选定行中的项目进行一些更新,但是经过一些搜索后,我找不到如何访问行中的项目,我认为DataItem可以工作,但它给了我一个空值 编辑:简而言之,我有一个从数据源构建的GridView,因此基本上,每行代表一个对象,当我在其中一行中选中复选框时,我希望能够获取与该行相关的对象,最简单的方法是什么 加载页面上的数据绑定: 下面是我在.aspx中的GridView:C# 从GridViewRow ASP.NET获取项目,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个GridView,我从SQL数据库将一个数据源绑定到它,网格中有一个带有复选框的列,因此我可以“选择”其中的一些项目(实际上是行)。我想在这里对每个选定行中的项目进行一些更新,但是经过一些搜索后,我找不到如何访问行中的项目,我认为DataItem可以工作,但它给了我一个空值 编辑:简而言之,我有一个从数据源构建的GridView,因此基本上,每行代表一个对象,当我在其中一行中选中复选框时,我希望能够获取与该行相关的对象,最简单的方法是什么 加载页面上的数据绑定: 下面是我在.aspx中的
<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请求,但它似乎有点重,必须有更好的解决方案。鉴于您的
asp:checkbox上的AutoPostBack
设置为true,您必须在设置复选框时更新行
因此,我建议您将eventOnCheckedChanged=“chkStatus\u OnCheckedChanged”
设置为asp:checkbox
调用chkSelect
,然后您只能更新所选行,而不必在enitre网格上迭代
下面是一个示例,说明如何获取选中复选框的行项目
public void chkStatus_OnCheckedChanged(object sender, EventArgs e)
{
CheckBox chkStatus = (CheckBox)sender;
//now grab the row that you want to update
GridViewRow row = (GridViewRow)chkStatus.NamingContainer;
string cid = row.Cells[1].Text;
bool status = chkStatus.Checked;
//now you can do you sql update here
}
除非在数据绑定完成后将数据源存储在ViewState或session中,否则将丢失数据源。除非您这样做,否则DataItem将始终为null。因此,我经常发现自己在视图状态下存储数据源。当然,这意味着你的页面会越来越大。如您所述的另一个选项是使用某种主键重新查询数据源。根据你的需要,我说不出哪个选项更好。我倾向于视图状态,而不是第二个DB调用,因为这可能是一个昂贵的调用,除非在数据绑定完成后将数据源存储在ViewState或会话中,否则会丢失数据源。除非您这样做,否则DataItem将始终为null。因此,我经常发现自己在视图状态下存储数据源。当然,这意味着你的页面会越来越大。如您所述的另一个选项是使用某种键重新查询数据源。根据你的需要,我说不出哪个选项更好。我倾向于查看状态,而不是第二次数据库调用,因为这可能是一个昂贵的调用。谢谢!这就是我正在寻找的答案,你应该考虑把它作为一个真正的答案,所以我可以把它解决。我可能也会使用ViewState,因为某些原因,循环DB调用的事实听起来真的很讨厌。
<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>
public void chkStatus_OnCheckedChanged(object sender, EventArgs e)
{
CheckBox chkStatus = (CheckBox)sender;
//now grab the row that you want to update
GridViewRow row = (GridViewRow)chkStatus.NamingContainer;
string cid = row.Cells[1].Text;
bool status = chkStatus.Checked;
//now you can do you sql update here
}