2011-01-27 114 views
1

需要帮助调整我的逻辑一点点。打破foreach循环

,你看,我有两个foreach loop两者的不同列在GridView控件 这个代码是在OnRowUpdating在GridView更多信息正是我在做什么,你可以看到在关闭线程here

的问题是:

在每一个循环我将更新一行数据库,但由于我有两个不同的循环,它不会退出,直到第一个循环完成。

举一个例子:我有_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

由于`_txt3`赋值在`if`块内,所以更新错误。您需要将任何引用放在`if`块的范围内,否则确保在使用之前将其分配给它。 – Jaymz 2011-01-27 17:01:01

回答

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

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; 

} 
+0

`item1`来自哪里? – 2011-01-27 16:26:15

+0

对不起,错字,请再看一遍 – TheGeekYouNeed 2011-01-27 16:28:04