如何在下面的代码中从foreach循环内的数据行中删除行[6]

本文关键字:删除行 数据 foreach 在下面 代码 循环 | 更新日期: 2023-09-27 18:34:02

我有一个DataTable dt,我正在尝试在其中再添加两列。我成功了。但是当我在获取数据后尝试删除行[6]时,我面临着删除它的问题。我正在寻找一种删除特定行的方法。

protected void gvTimeSheet_DataBound(object sender, EventArgs e)   
{
    DataTable dt = new DataTable();
    int intUserID = TypeConvert.IsNullInt32(ddlUsers.SelectedValue, 0);
    DateTime fromDate = Convert.ToDateTime(UCFromDate.selectedDate);
    DateTime toDate = Convert.ToDateTime(UCToDate.selectedDate);
    string strQuery = "EXEC SPRptUserTimeSheet_AP @User=" + intUserID + ",@dateFrom='" + fromDate + "',@dateTo='" + toDate + "'";
    dt = DataHelper.ExecuteQuery(strQuery);
    dt.Columns.Add("Booked Hrs");
    dt.Columns.Add("Time Zone");

    foreach (DataRow row in dt.Rows)
    {
        string userName = row[0].ToString();
        string bookedHr = row[6].ToString();
        string timezone = row[7].ToString();
        if (userName == string.Empty)
        {
            row[0] = ddlUsers.SelectedItem.Text;
        }
        if (bookedHr == string.Empty)
        {
            row["Booked Hrs"] = 0.0;
        }
        if (bookedHr != string.Empty)
        {
            row["Booked Hrs"] = objCommon.fnGetEffortInHrMinFormat(Convert.ToInt32(bookedHr));
        }
        if (timezone == "0")
        {
            row["Time Zone"] = "Offshore";
        }
        if (timezone == "1")
        {
            row["Time Zone"] = "Onsite";
        }
    }
    ViewState["dtExport"] = dt;
}
}

如何在下面的代码中从foreach循环内的数据行中删除行[6]

你试图做的事情并没有真正的意义:

要理解原因,您需要考虑表达式row[6]的真正含义。这意味着

此行中第 6 列的值。

因此,实际从行中删除第 6 列的唯一方法是将其从表中删除:

dt.Columns.RemoveAt(6);

那会摆脱列就可以了。但是,您已经为所有行删除了它。

因此,您无法从foreach循环中执行此操作。如果你这样做了,你会删除

  • 第6纵队第一次,
  • 第二次(原始)第 7 列,以及
  • (最初)第 8 列第三次通过循环,
  • 等。。

直到您出现尝试删除 Column 集合边界之外的列的异常。

因此,如果您确实必须摆脱第 6 列,请在循环后这样做。

如果从集合中删除某个项,则该集合已更改,无法继续枚举foreach而是使用for循环。

添加代码段,

for(int i = dt.Rows.Count; i >= 0; i--)
{
    DataRow dr = dt.Rows[i];
if(i==6||i==7)
{
 dr.Delete();
}
}

我的建议是使用 for loop 而不是 foreach loop。试试这个

for (int i =dt.Rows.Count-1; i >= 0; i--) 
{
   if (true) 
   {
      dt.Rows[i].Delete();
   }
}
dt.AcceptChanges();
ViewState["dataTable"]=dt;