如何在没有For Each Loop的情况下更新C#中的DataTable?

时间:2014-01-31 06:22:05

标签: c# asp.net gridview datatable datarow

我正在尝试为我的数据表中的每一行运行循环,但是它给了我错误,因为我无法修改每个循环的集合......我还能做些什么来更新表?

我正在尝试删除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;
}

1 个答案:

答案 0 :(得分: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)
    {
              ...
    }