C # редактирование DataTable изменения не сохранены - PullRequest
0 голосов
/ 01 июля 2018

У меня проблема с тем, что я создал объект DataTable в одном классе и вернул его основной программе. Я вызываю метод (1), который извлекает некоторую информацию из таблицы данных и впоследствии удаляет те же строки. Затем я запускаю другой метод (2), который извлекает данные из столбца, но я вижу, что строки, которые я удалил в другом методе (1), не изменились. Я посчитал количество строк в методе (1) и количество строк уменьшилось, что указывает на то, что они были удалены.

Может ли это быть как-то связано со ссылками на объекты?

Заранее извиняюсь за любые ошибки, которые я допустил, задавая этот вопрос. Это мой первый вопрос к стеку, и я все еще плохо знаком с кодированием.

Заранее спасибо!

Основная программа:

filepath = @"E:\1802370 11.05.18 qCML 6x10E6 ERM_analysed.txt";

//Create a datatable from _analysed file and delete unwated columns
DataTable dataTable = csv.convertToDataTable(filepath);

//Assign slope and r2 values for both BCR and ABL
//Delete rows after
plate.getSlopeandR2(dataTable);
plate.getSampleList(dataTable);

Метод DataTable:

    //Converts text file into a datatable to be manipluated.
    public DataTable convertToDataTable(string filepath)
    {
        StreamReader sr = new StreamReader(filepath);

        string[] headers = sr.ReadLine().Split('\t');
        DataTable dt = new DataTable();
        foreach (string header in headers)
        {
            dt.Columns.Add(header);
        }
        while (!sr.EndOfStream)
        {
            string[] rows = Regex.Split(sr.ReadLine(), "\t");

            DataRow dr = dt.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                dr[i] = rows[i];
            }
            dt.Rows.Add(dr);
        }

        sr.Close();
        return dt;

Метод (1): получить значения, удалить строки

    //Get slope and r2 values
    //Delete rows after info is retrieved
    public void getSlopeandR2(DataTable dataTable)
    {
        bool isABL = true;
        List<int> rowsToDelete = new List<int>();
        Console.WriteLine(dataTable.Rows.Count);

        foreach (DataRow row in dataTable.Rows)
        {
            int rowIndex;

            if (row["Well"].ToString() == "Slope" && isABL == true)
            {
                rowIndex = dataTable.Rows.IndexOf(row);
                ablSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
                ablR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
                isABL = false;
                rowsToDelete.Add(rowIndex);
                rowsToDelete.Add(rowIndex + 1);
                rowsToDelete.Add(rowIndex + 2);
                rowsToDelete.Add(rowIndex + 3);
                rowsToDelete.Add(rowIndex + 4);
                rowsToDelete.Add(rowIndex + 5);

            }
            else if (row["Well"].ToString() == "Slope" && isABL == false)
            {
                rowIndex = dataTable.Rows.IndexOf(row);
                biomedSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
                biomedR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
                rowsToDelete.Add(rowIndex);
                rowsToDelete.Add(rowIndex + 1);
                rowsToDelete.Add(rowIndex + 2);
                rowsToDelete.Add(rowIndex + 3);
                rowsToDelete.Add(rowIndex + 4);
                rowsToDelete.Add(rowIndex + 5);
                rowsToDelete.Add(rowIndex + 6);
            }

        }

        for (int i = 0; i < rowsToDelete.Count; i++)
        {
            dataTable.Rows.RemoveAt(i);
        }

        Console.WriteLine(dataTable.Rows.Count);
    }

Метод (2): получение данных (удаленные строки по-прежнему включены)

        //Get unique list of sample ID's on plate
    public void getSampleList(DataTable dataTable)
    {
        string tempValue;

        foreach (DataRow row in dataTable.Rows)
        {
            if (!Samples.Contains(row["Sample Name"].ToString()))
            {
                tempValue = Convert.ToString(row["Sample Name"]);
                Samples.Add(tempValue);
            }
        }

        foreach (string id in Samples)
        {
            Console.WriteLine(id);
        }
    }

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Существует два способа удаления DataRow из DataTable. После прочтения файла вызовите AcceptChanges () для внутренней фиксации DataTable.

//Created new table sample
DataTable dt1 = new DataTable("dt1");
dt1.Columns.Add("Id", typeof(int));
dt1.Columns.Add("Name");

//Added dummy data
dt1.Rows.Add(1, "Abc");
dt1.Rows.Add(2, "Def");

//You must accept changes after reading file, so you can track changes
dt1.AcceptChanges();

//Below line will remove row permanently.
dt1.Rows.RemoveAt(0);

//Below line will mark row as deleted, still row count will be same till AcceptChanges() called.
dt1.Rows[0].Delete();
dt1.AcceptChanges();
0 голосов
/ 02 июля 2018

После удаления строк из таблицы принять изменения

dataTable.AcceptChanges ()

for (int i = 0; i < rowsToDelete.Count; i++)
    {
        dataTable.Rows.RemoveAt(i);
        dataTable.AcceptChanges();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...