打破foreach循环

时间:2011-01-27 16:10:06

标签: asp.net gridview

需要帮助我稍微调整一下我的逻辑。

如您所见,我有两个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循环值?

2 个答案:

答案 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),允许您只使用标准数组表示法来获取集合中的项目。