使用多个foreach循环修改DataTable

时间:2016-06-03 15:13:30

标签: c# foreach

首先感谢您抽出时间提供帮助,如果可以的话,现在回答这个问题。我正在修改现有的数据表以获得所需的输出。

我已经编写了代码,无论是什么都没做,删除或添加列/行数据。我使用数据集结果查看器查看了数据表,并根据需要显示。但是这里存在问题,数据行和数据列都在foreach循环中,而我现在得到了#34;集合被修改枚举操作可能无法执行。"。

我在一个数据表中做了所有事情,没有意识到如果这是正确的术语,它会使表不可变或不可修改。我复制了表,并在for循环中尝试向后迭代它作为StackOverflow的建议。但它没有用。所以,我想我可能要创建一个新方法并在其中创建一个新的数据表,然后设置列,实例化数据表并循环遍历原始表。然后将行添加到新表并返回该表。

但我对如何开始这个过程感到迷茫,我有点困惑的是,最好的方法是什么,并且可以使用一些建议。这是我的代码,如果它有帮助。我有很多小扩展方法用于完成大部分工作。感谢您对此事的任何建议!

internal void ParseNames(DataTable ConvertExcelToDataTable)
    {
        try
        {
            if (ConvertExcelToDataTable != null && ConvertExcelToDataTable.Rows != null)
            {
                foreach(DataRow dr in ConvertExcelToDataTable.Select())
                {
                    foreach(DataColumn col in ConvertExcelToDataTable.Columns)
                    {
                            ConvertExcelToDataTable.AcceptChanges(); //initial DataTable Save
                            dr.Table.Columns.RemoveItem("LOB");
                            dr.Table.Columns.RemoveItem("UMID");
                            dr.Table.Columns.RemoveItem("MBR_SEX");
                            dr.Table.Columns.RemoveItem("DOS");
                            dr.Table.Columns.RemoveItem("Measures");
                            dr.Table.Columns.RemoveItem("ProjectName");
                            dr.Table.Columns.RemoveItem("Project Name");
                            dr.Table.Columns.RemoveItem("MemberKey");
                            dr.Table.Columns.RemoveItem("MSR_KEY");
                            dr.Table.Columns.RemoveItem("PRV_LAST");
                            dr.Table.Columns.RemoveItem("PRV_FIRST");
                            dr.Table.Columns.RemoveItem("PRV_MI");
                            dr.Table.Columns.RemoveItem("LocationName");
                            dr.Table.Columns.RemoveItem("Request ID");
                            dr.Table.Columns.RemoveItem("Measure(s)");
                            dr.Table.Columns.ReplaceItem("", "3");
                            dr.Table.Columns.ReplaceItem(" ", "3");
                            dr.Table.Columns.RenamingColumnValue("PERS_FIRST_NAME", "First_Name");
                            dr.Table.Columns.RenamingColumnValue("FirstName", "First_Name");
                            dr.Table.Columns.RenamingColumnValue("MBR_FIRST", "First_Name");
                            dr.Table.Columns.RenamingColumnValue("MBR_LAST", "Last_Name");
                            dr.Table.Columns.RenamingColumnValue("LastName", "Last_Name");
                            dr.Table.Columns.RenamingColumnValue("Gender", "Gender");
                            dr.Table.Columns.RenamingColumnValue("MBR_SEX", "Gender");
                            dr.Table.Columns.RenamingColumnValue("PERS_MID_INIT", "Middle_Initial");
                            dr.Table.Columns.RenamingColumnValue("MBR_MI", "Middle_Initial");
                            dr.Table.Columns.RenamingColumnValue("BIRTHDATE", "Date_of_Birth");
                            dr.Table.Columns.RenamingColumnValue("PatientDOB", "Date_of_Birth");
                            dr.Table.Columns.RenamingColumnValue("DOB", "Date_of_Birth");
                            dr.Table.Columns.RemoveSpecialCharacters("(");
                            dr.Table.Columns.RemoveSpecialCharacters(")");
                            dr.Table.Columns.RemoveSpecialCharacters(",");
                            dr.Table.Columns.RemoveSpecialCharacters("=");
                            dr.Table.Columns.RemoveSpecialCharacters("!");
                            dr.Table.Columns.RemoveSpecialCharacters("-");
                            dr.Table.Columns.SplitPatientData("Patient Name");
                            dr.Table.Columns.SplitPatientData("PatientName");
                            dr.Table.Columns.SplitPatientData("Patient, Name");
                            dr.Table.Columns.RenamingColumnValue("Patient", "First_Name");
                            dr.Table.Columns.RenamingColumnValue("Name", "Last_Name");
                            SplitPatientRowData(ConvertExcelToDataTable);
                            dr.Table.Columns.RemoveItem("Patient Name");
                            ReverseRowsInDataTable(ConvertExcelToDataTable);
                            ConvertExcelToDataTable.AcceptChanges();
                        }
                }
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw;
        }
    }

1 个答案:

答案 0 :(得分:0)

您所做的基本上是将DataTable转换为另一个DataTable。您可以创建新的DataTable并从方法返回它,而不是修改现有的internal DataTable ParseNames(DataTable ConvertExcelToDataTable) { if (ConvertExcelToDataTable == null && ConvertExcelToDataTable.Rows == null) { return null; } var output = new DataTable(); // Add columns here try { foreach(DataRow dr in ConvertExcelToDataTable.Select()) { // Add rows here } } catch(Exception ex) { Console.WriteLine(ex.Message); throw; } return output; } 。这样,您就不会在迭代时修改DataTable。

 <input type="submit" class="MainButton" title="Change" id="ch01_changebutton" onclick="window.location.href='https://www.websiteurl.com'; return false;" value="Change" name="ch01$changebutton">