需要帮助我稍微调整一下我的逻辑。
如您所见,我有两个foreach loop
,并且两者都在gridview中的不同列中
此代码位于gridview中的OnRowUpdating中,以获取更多信息我正在做什么,您可以看到已关闭的线程here
在每个循环中我将更新一行到db,但由于我有两个不同的循环,它将不会退出,直到第一个循环结束。
举个例子:我有_rpt.Count = 2所以在它到达第二个循环之前会循环两次。
GridViewRow row = gv.SelectedRow;
Repeater _rpt = gv.Rows[e.RowIndex].Cells[8].FindControl("rptReg") as Repeater;
Repeater _rpt1 = gv.Rows[e.RowIndex].Cells[9].FindControl("rptVisitor") as Repeater;
foreach (RepeaterItem item in _rpt.Items)
{
TextBox _txt = item.FindControl("txtId") as TextBox;
TextBox _txt1 = item.FindControl("txtName") as TextBox;
//update db
}
foreach (RepeaterItem item1 in _rpt1.Items)
{
TextBox _txt3 = item1.FindControl("txtVisitor") as TextBox;
//update db
}
有没有办法可以读取两个foreach循环值?
答案 0 :(得分:1)
foreach (RepeaterItem item in _rpt.Items)
{
TextBox _txt = item.FindControl("txtId") as TextBox;
TextBox _txt1 = item.FindControl("txtName") as TextBox;
//update db
TextBox _txt3 = _rpt1.Items[item.ItemIndex].FindControl("txtVisitor") as TextBox;
}
答案 1 :(得分:1)
如果你在多个集合中进行循环,并且想要多次访问每个集合,那么foreach
可能不是最合适的。
尝试使用常规for
循环:
for (int i = 0; i < _rpt.Items.Count; i++)
{
TextBox _txt = _rpt.Items[i].FindControl("txtId") as TextBox;
TextBox _txt1 = _rpt.Items[i].FindControl("txtName") as TextBox;
if (_rpt1.Items.Count > i)
TextBox _txt3 = _rpt1.Items[i].FindControl("txtVisitor") as TextBox;
//update db
}
以上只会按预期工作if (_rpt.Items.Count >= _rpt1.Items.Count)
,所以一定要检查并使用包含最多项目的集合,如果它们将会有所不同。
使用foreach
循环枚举单个集合中的项目,允许您直接引用每个迭代中的每个项目。如果您只访问一个集合,这很方便,因为您不需要使用数组索引器,并且可以在循环初始化时使用您提供的名称。
当你循环遍历多个集合时,它并不那么方便,因为你只能引用循环头中使用的集合。
使用for
循环可以跟踪您所在的索引(使用int
),允许您只使用标准数组表示法来获取集合中的项目。