Проблема удаления столбца с датой в C # - PullRequest
0 голосов
/ 08 мая 2019

У меня была проблема с таблицей данных, содержащейся в другой таблице данных, которую я передавал в метод.

В основном я хотел удалить некоторые столбцы и записать исправленную таблицу в файл.

Затем у меня были другие действия, которые я хотел выполнить с исходным объектом DataTable.Однако я заметил, что при удалении столбцов были удалены все экземпляры этой таблицы, включая основную.

Мне удалось создать решение, в котором я создал новую таблицу и заполнил ее данными из оригинала.,

Но я просто искал понимание того, почему это происходит, не следует ли защищать исходные данные?

Кроме того, впервые публикуйте сообщения, извините, если что-то странно с моим сообщением

 static void Main(string[] args)
 {
        //create tables
        DataTable OriginalTbl = CreateTbl();
        //pull the nested table out 
        DataTable NestedTbl = new DataTable();
        NestedTbl = (DataTable)(OriginalTbl.Rows[0]["Nested"]);
        //call the method
        RemoveCols(OriginalTbl);

        //try retrieving the data again 
        string Data;
        string Excps;
        //will throw error here 
        Data = NestedTbl.Rows[0]["Data"].ToString();
        Excps = NestedTbl.Rows[0]["Exceptions"].ToString();
        // something else 

    }
    static DataTable CreateTbl()
    {
        DataTable OriginalTbl = new DataTable();
        DataTable NestedTbl = new DataTable();
        OriginalTbl.Columns.Add("Nested", typeof(DataTable));

        NestedTbl.Columns.Add("Data");
        NestedTbl.Columns.Add("Exceptions");
        NestedTbl.Columns.Add("results");

        DataRow NestedRow = NestedTbl.NewRow();
        NestedRow["Data"] = "blah data";
        NestedRow["Exceptions"] = "blah Exceptions";
        NestedRow["results"] = "blah Results";
        NestedTbl.Rows.Add(NestedRow);

        // add to the original table
        DataRow OrigRow = OriginalTbl.NewRow();
        OrigRow["Nested"] = NestedTbl;
        OriginalTbl.Rows.Add(OrigRow);
        return OriginalTbl;
    }

    static void RemoveCols(DataTable MainTbl)
    {
        DataTable NestedTbl = (DataTable)(MainTbl.Rows[0]["Nested"]);
        NestedTbl.Columns.Remove("Data");
        NestedTbl.Columns.Remove("Exceptions");
        //blah do something here 
    }

1 Ответ

2 голосов
/ 08 мая 2019

Однако я заметил, что при удалении столбцов все экземпляры этой таблицы, включая основную, были удалены.

Не совсем, у вас есть только один экземпляр из вложенных DataTable, но у вас есть несколько ссылок на этот экземпляр. Независимо от того, какую ссылку на вложенную таблицу вы используете, сам экземпляр - это то, что изменяется при добавлении или удалении столбцов или иным образом изменении данных.

Это одна из основ ОО-программирования, которая вам обязательно понадобится.

// Creates a new instance of DataTable
DataTable NestedTbl = new DataTable();

// Immediately throw away the new instance for the existing instance stored in OriginalTbl
NestedTbl = (DataTable)(OriginalTbl.Rows[0]["Nested"]);

Когда вы делаете это, вы не создаете копию исходной вложенной таблицы. Вы просто перезаписываете ссылку на новый экземпляр другой на существующую вложенную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...