从GridViewRow ASP.NET获取项目

我有一个GridView,我从SQL数据库绑定了一个DataSource,网格有一个带有复选框的列,所以我可以“选择”其中的一些项目(实际上是行)。 我想要的是在每个选定的行中对Item进行一些更新,但在一些搜索后我找不到如何访问一行中的Item,虽然DataItem可以工作,但它给了我一个Null。

编辑:为了简短起见,我有一个从DataSource构建的GridView,所以基本上,每行代表一个Object,当我在其中一行中选中了一个复选框时,我希望能够获取与之相关的Object那一行,最简单的方法是什么?

Page_Load上的DataBinding:

if (!Page.IsPostBack) { gvUnusedAccessories.DataSource = currentContext.Items.OfType().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:

                

有关如何访问Row中包含的Object的任何提示? 我知道我实际上可以获得ID,然后向我的数据库发出SQL请求,但它看起来有点沉重,必须有一个更好的解决方案。

除非您在数据绑定完成后将数据源存储在ViewState或会话中,否则会丢失数据源。 除非您这样做,否则DataItem将始终为null。 因此,我经常发现自己将数据源存储在视图状态。 当然,这意味着您的页面大小会变得更大。 您所说的另一个选项是使用某种主键重新查询数据源。 根据您的需要,我不能说哪个选项更好。 我倾向于倾向于视图状态而不是第二个DB调用,因为这可能是一个昂贵的调用

假设您在asp:checkbox上将AutoPostBack设置为true,则必须在设置复选框时更新该行

所以我建议你在asp:checkbox上设置事件OnCheckedChanged="chkStatus_OnCheckedChanged" 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 }