【IT168技术文档】
今天在做项目的时候,遇到了一个比较奇怪的问题,下边是导致这个奇怪问题的代码:
假设:第4行代码执行后,dt中的数据有3条数据,我们将取到的数据放入Cache中,第7行代码得到一个DataView,我们将得到的DataView作为dl_Info(DataList控件)的数据源,第11行代码对DataView进行筛选,筛选后dv中的数据为1条。1 DataTable dt = (DataTable)this.Cache["Key"]; 2 if (dt == null) 3 { 4 dt = Category.GetDataList(); 5 this.Cache.Insert("Key", dt); 6 } 7 DataView dv = dt.DefaultView; 8 this.dl_Info.DataSource = dv; 9 this.dl_Info.DataBind(); 10 11 dv.RowFilter = "Depth=1"; 12 if (dv.Count == 1) 13 this.lbl_Message.Text = dv[0]["nodeName"].ToString();
上边的这段小代码,在Cache["Key"]值为null的时候,是正常的,一旦Cache["Key"]的值不是null,dl_Info的控件的数据源就不正确了,dl_Info的数据源变成了筛选后的数据,即1条数据。
刚开始怎么也想不明白,代码不长,也没有过多的复杂逻辑,数据怎么就不正常呢?后来用工具(.NET Reflector)查看了一下DataTable的DefaultView属性,才算明白怎么回事。DefaultView属性的反射代码为:
1[ResDescription("DataTableDefaultViewDescr"), Browsable(false)] 2public DataView DefaultView 3{ 4 get 5 { 6 DataView defaultView = this.defaultView; 7 if (defaultView == null) 8 { 9 if (this.dataSet != null) 10 { 11 defaultView = this.dataSet.DefaultViewManager.CreateDataView(this); 12 } 13 else 14 { 15 defaultView = new DataView(this, true); 16 defaultView.SetIndex2("", DataViewRowState.CurrentRows, null, true); 17 } 18 defaultView = Interlocked.CompareExchange<DataView>(ref this.defaultView, defaultView, null); 19 if (defaultView == null) 20 { 21 defaultView = this.defaultView; 22 } 23 } 24 return defaultView; 25 } 26} 27 28