2014-01-31 42 views
0

我想在我的數據表中的每一行運行循環,但它給了我錯誤,因爲我無法修改每個循環中的集合...我還能做什麼來更新表?如何在不使用每個循環的情況下更新C#中的DataTable?

我試圖刪除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)); 
    } 
} 

編輯1: foreach語句被用於通過收集迭代獲取您想要的信息,但不能用於添加或刪除源集合中的項目以避免不可預知的副作用。如果您需要添加或刪除源集合中的項目,請使用for循環。 (從MSDN

編輯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

使用for循環代替foreach有什麼優勢? – pravprab

相關問題