我有一个DataTable dt
我正在尝试添加两列。我成功了。但是当我在获取数据后尝试删除row [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;
}
}
答案 0 :(得分:1)
你要做的事情并没有多大意义:
要理解为什么,您需要考虑表达式row[6]
的真正含义。这意味着
此行中第6列的值。
因此,从行中实际删除第6列的唯一方法是将其从表中删除:
dt.Columns.RemoveAt(6);
这将摆脱列好。但是你已经为所有行删除了它。
所以你不能在foreach
循环中做到这一点。如果你这样做,你会删除
除非您尝试删除Column集合边界之外的列。
所以,如果你必须在循环之后完全摆脱第6列。
答案 1 :(得分:0)
如果您从集合中删除某个项目,则该集合已更改,您无法继续通过foreach
进行枚举,而是使用for
循环。
添加代码段,
for(int i = dt.Rows.Count; i >= 0; i--)
{
DataRow dr = dt.Rows[i];
if(i==6||i==7)
{
dr.Delete();
}
}
答案 2 :(得分:0)
我的建议是使用 for 循环而不是 foreach 循环。试试这个
for (int i =dt.Rows.Count-1; i >= 0; i--)
{
if (true)
{
dt.Rows[i].Delete();
}
}
dt.AcceptChanges();
ViewState["dataTable"]=dt;