我在传递给方法的另一个数据表中包含一个数据表时遇到问题。
基本上,我想删除一些列并将修改后的表写入文件。
然后我还想对原始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
}
答案 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"]);
执行此操作时,不会创建原始嵌套表的副本。您只需用对现有嵌套表的引用覆盖对新实例的引用即可。