2014-01-31 38 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

相关问题