2014-01-31 1 views
0

Я пытаюсь запустить цикл для каждой строки в моей таблице данных, но это дает мне ошибку, поскольку я не могу изменить коллекцию для каждого цикла ... что еще я могу сделать для обновления таблицы?Как обновить DataTable в C# без для каждого цикла?

Я пытаюсь удалить повторяющиеся записи w.r.t один столбец, который название прибора и если такой выбор будет сделан на основе повторяющегося имени прибора, то просто обновить старую количество.

Вот код:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     dt = new DataTable(); 
     dt.Columns.Add("Appliance Name", typeof(string)); 
     dt.Columns.Add("Quantity", typeof(int)); 
     dt.Columns.Add("Day Time(Hrs)", typeof(int)); 
     dt.Columns.Add("Backup Time(Hrs)", typeof(int)); 
     // dt.Rows.Add("Sana", 5, 4, 3); 
     Session["MyDataTable"] = dt; 
    } 
} 

protected void BtnAddNext_Click(object sender, EventArgs e) 
{ 
    DataTable dtab = (DataTable)Session["MyDataTable"]; 

    if (dtab.Rows.Count != 0) 
    { 
     foreach (DataRow r in dtab.Rows) 
     { 
      if (Convert.ToString(r["Appliance Name"]) == DDLAppName.Text) 
      { 
       int temp = Convert.ToInt32(r["Quantity"]); 
       r["Quantity"] = Convert.ToInt32(QtyTB.Text) + temp; 
      } 
      else 
      { 
       dtab.Rows.Add(DDLAppName.SelectedValue, Convert.ToInt32(QtyTB.Text), Convert.ToInt32(DayTymTB.Text), Convert.ToInt32(BackUpTymTB.Text)); 
      } 
     } 
    } 
    else if (dtab.Rows.Count == 0) 
    { 
     dtab.Rows.Add(DDLAppName.SelectedValue, Convert.ToInt32(QtyTB.Text), Convert.ToInt32(DayTymTB.Text), Convert.ToInt32(BackUpTymTB.Text)); 
    } 

    //dtab = dtab.DefaultView.ToTable(true, "Appliance Name", "Quantity", "Day Time(Hrs)", "Backup Time(Hrs)"); 
    AllItems.DataSource = dtab; 
    AllItems.DataBind(); 
    AllItems.Visible = true; 
} 

ответ

5

Просто попробуйте использовать for петлю вместо foreach так:

for (int rowIndex = 0; rowIndex < dtab.Rows.Count; rowIndex++) 
{ 
    DataRow r = dtab.Rows[rowIndex]; 
    if (Convert.ToString(r["Appliance Name"]) == DDLAppName.Text) 
    { 
     int temp = Convert.ToInt32(r["Quantity"]); 
     r["Quantity"] = Convert.ToInt32(QtyTB.Text) + temp; 
    } 
    else 
    { 
     dtab.Rows.Add(DDLAppName.SelectedValue, Convert.ToInt32(QtyTB.Text), Convert.ToInt32(DayTymTB.Text), Convert.ToInt32(BackUpTymTB.Text)); 
    } 
} 

EDIT 1: Оператор Еогеасп используется для итерации по коллекции чтобы получить нужную информацию, но не может использоваться для добавления или удаления элементов из исходной коллекции, чтобы избежать непредсказуемых побочных эффектов. Если вам нужно добавить или удалить элементы из исходной коллекции, используйте цикл for. (Из MSDN)

Edit 2 Если вы хотите добавить строки в вашем foreach цикле, выполните следующие действия:

DataRow[] dataRows = new DataRow[dt.Rows.Count]; 
    dt.Rows.CopyTo(dataRows, 0); 
    foreach (DataRow r in dataRows) 
    { 
       ... 
    } 
+0

, что 'я' здесь ?? dtab.Rows [I]; ?? –

+0

О, о, извините, это должен быть rowIndex, я отредактирую сообщение. –

+0

В чем преимущество использования для цикла вместо foreach ..? – pravprab