100分探论[简单问题,复杂想法] DataTable.Select()方法究竟是何原理?
创建1个表:
private DataTable BuildOriginData()
{
DataTable dt = new DataTable();
dt.Columns.Add( "ID ", typeof(System.String));
dt.Columns.Add( "Name ", typeof(System.String));
for (int i = 0; i < 50; i++)
{
DataRow dr = dt.NewRow();
dr[0] = string.Format( "ID{0} ", (i+1).ToString());
dr[1] = string.Format( "Name{0} ", (i+1).ToString());
dt.Rows.Add(dr);
}
return dt;
}
现在的问题来了,
我用dt.Columns.Remove( "Name ") //删除Name列
好了,这下dt.Select( "ID= 'XXXX ' ") 死活都会报InvalidIndexofRange Exception了
,请大家不要就我的方法进行讨论(说为何要删除列),我想了解Select方法的原理,
Name列按索引来看是1,我在后面ColumnCollection中删除最后1个索引,为何会影响Select方法呐,如果我删除ID列,然后 Select Name列,如果出错,我还是能理解的,因为索引被重新定义了。
ps:我目前的解决方法:a.不要删除任何列 b.删除列后,在Select方法之前再加回来
期待朋友们踊跃讨论~
------解决方案--------------------删除列,先删除数据
------解决方案--------------------不知道你怎么处理的
我把你的代码拷过来
dt.Columns.Remove( "Name " );
DataRow[ ] dataRows = dt.Select( "ID= 'ID11 ' " );
dataRows 是ID11
//dt.Columns.Remove( "Name " );
DataRow[ ] dataRows = dt.Select( "ID= 'ID11 ' " );
dataRows 是ID11 和Name11
并未报错
你跟踪下你的程序
Remove( "Name ")后dt的数据是怎么样的
还有Remove后你获得的是一维数组了,不是2维数组
要看Select原理,你用Reflector看看相关的DLL
------解决方案--------------------你是不是做了别的处理??
DataTable dt = new DataTable();
dt.Columns.Add( "ID ", typeof(System.String));
dt.Columns.Add( "Name ", typeof(System.String));
for (int i = 0; i < 50; i++)
{
DataRow dr = dt.NewRow();
dr[0] = string.Format( "ID{0} ", (i + 1).ToString());
dr[1] = string.Format( "Name{0} ", (i + 1).ToString());
dt.Rows.Add(dr);
}
dt.Columns.Remove( "Name ");
DataRow[] rows = dt.Select( "ID=