разрыв цикла foreach - PullRequest
       4

разрыв цикла foreach

1 голос
/ 27 января 2011

нужна помощь в настройке моей логики.

как видите, у меня есть два foreach loop, и оба для разных столбцов в gridview этот код находится в OnRowUpdating в gridview для получения дополнительной информации, что именно я делаюВы можете увидеть закрытую нить здесь

проблема в том, что

в каждом цикле я буду обновлять строку в БД, но так как у меня два разных цикла, он не будетвыход до завершения первого цикла.

для примера: у меня есть _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 ]

1 голос
/ 27 января 2011

Если вы выполняете цикл по нескольким коллекциям и хотите получить доступ к каждой коллекции более одного раза, 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 голос
/ 27 января 2011
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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...