日期:2014-05-18  浏览次数:20881 次

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=