【发布时间】:2018-04-13 17:34:08
【问题描述】:
我目前正在将上传的 Excel 文档中的字段映射到数据表。我希望删除未选择但仍显示的列。
这是我的代码:
if(DT.Columns.IndexOf("First Name") != -1)
DT.Columns["First Name"].ColumnName = "First NameMap";
DT.Columns[mapping.FirstNameColumnId].ColumnName = "First Name";
if (DT.Columns.IndexOf("Last Name") != -1)
DT.Columns["Last Name"].ColumnName = "Last NameMap";
DT.Columns[mapping.LastNameColumnId].ColumnName = "Last Name";
if (DT.Columns.IndexOf("Email Address") != -1)
DT.Columns["Email Address"].ColumnName = "Email AddressMap";
DT.Columns[mapping.EmailColumnId].ColumnName = "Email Address";
int ColumnCounter = 0;
foreach(DataColumn column in DT.Columns)
{
if(ColumnCounter != mapping.FirstNameColumnId && ColumnCounter != mapping.LastNameColumnId && ColumnCounter != mapping.EmailColumnId)
{
DT.Columns.Remove(column);
}
}
【问题讨论】:
-
当您在调试器中单步执行此代码时,它具体在哪里失败?是否输入了
foreach循环?里面有没有输入if语句?当您在目标列上调用.Remove()时,它是否会从该对象中删除? -
那么,问题是什么?
-
代码并没有因此而失败。它进入 DT.Columns.Remove(column);但仍在显示 excel 表中的所有原始列。我只希望它显示名字、姓氏和电子邮件
-
您应该注意在 foreach 中修改 Columns 集合 - 为了安全起见,请使用 .ToList() - stackoverflow.com/questions/14413099/…
-
正如 PaulF 所说,您不应该在自己的 foreach 循环中修改集合。您可以按照他的说法使用副本,或者使用 For 循环,但请注意从集合中删除项目时索引会发生变化。您也可以只使用 lambda 表达式将列过滤为您想要的任何列。
标签: c# database excel datatable