query = (from s in dt.AsEnumerable() where s["YsKinds"].ToString().Contains(hd.Value) select s).First(); TempDR = query;//复制给新行 TempDR["yskinds"] = dropzjsubject.Text; TempDR["bzr"] = dropzjbzr.Text;//给新行赋值 UpdateRows.Add(TempDR);//Ilist添加新行 foreach (DataRow ds in dt.Rows) { Response.Write(ds["YsKinds"].ToString() + " " + ds["bzr"].ToString() + "<br/>");//结果居然是新行赋值后的值?难道dr也驻留的? }
TempDR = query;//复制给新行
这不是复制,这是赋值,对于引用类型,是指定引用,也就是说 TempDR 和 query 指向同一个 DataRow.
你应该用 DataRow.Clone() ,克隆一个新的 DataRow.
有这方法吗,我怎么找不到
@happydaily: 我就给你写了个伪码,也就是表示一个意思,因为你的代码写错了,如果你能理解我写的伪码,那说明你知道自己错在那儿了,你现在这样问,表明你对DataTable,DataRowd的关系还是不明白,所以你才会写出 TempDR = query 和 UpdateRows.Add(TempDR) 这样的语句。