C#数据表列删除问题

时间:2019-05-08 16:43:31

标签: c# datatable

我在传递给方法的另一个数据表中包含一个数据表时遇到问题。

基本上,我想删除一些列并将修改后的表写入文件。

然后我还想对原始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 个答案:

答案 0 :(得分:2)

  

但是我注意到,当我删除列的该表的所有实例(包括主表)时,都已删除。

不完全是,嵌套DataTable中只有一个实例,但是对该实例有多个引用。无论您使用哪个对嵌套表的引用,实例本身都是在添加或删除列或更改数据时进行修改的内容。

这是您绝对需要了解的OO编程基础之一。

// 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"]);

执行此操作时,不会创建原始嵌套表的副本。您只需用对现有嵌套表的引用覆盖对新实例的引用即可。