我现在遇到一个问题,好象很简单的:
已经得到一个DataTable dt
我现在有一些查询条件,我想从这个dt中查到想要到记录后,生成一个新的DataTable
可当我使用dt.select(where)后,返回是DataRow[]数组
我New一个新DataTable dt2以后,
foreach(DataRow row in dt)
{
 dt2.Rows.Add(row);//这时报错,因为这个row是dt表的,不能被关联到dt2了
}请问以上的问题怎么办?是否还有更简单的方法??

解决方案 »

  1.   

    先用原始表的Clone方法克隆一个同构表,然后添加
      

  2.   

    你先DataTable dt2 = ds.Tables[0].Clone();
    然后在importRow这个方法.
    查一下MSDN.
      

  3.   

    看来我说的不够清楚啊:
    比如:
    dt表里有十条数据
    我还有个查询字符串,比如这个查询会从dt里查出五条
    dt2=dt.Clone()后dt2还是十条记录我要dt2里只要那符合条件的五条记录就可以了。请大家再思考一下。有没有好的方法。
      

  4.   

    使用dataview
    例子:
    dim dv as dataview = ds1.tables("authors").defaultview
    dv.rowfilter = "country = 'china'"
    da.sort = "authorName"明白了?
      

  5.   

    楼上的。那如何把这个DataView转换成那个DataTable呢?
      

  6.   

    把你的DataTable装入一个DataView
    DataView dv = new DataView(ds.Tables["TableName"]);
    dv.RowFilter="FieldName LIKE '%" + strFieldValue + "%'"; //类似SQL的WHERE 子句的语法
      

  7.   

    一般用SqlAdapter查询出来的都是DataSet,而DataSet中保存的又是表,你把DataSet中的那个表,不就是你需要的那个DataTable吗?
      

  8.   

    兄弟们,至于我为何要这样,我也说一下吧:
    对于系统中的一些基础数据,我们没有必要每次都去数据库中读取,这样会增加访问数据库的次数,大大影响效率,所以我要把基础表的数据放到内存中,然后在访问时,根据不同的条件,返回出所要的DataTable,所以出现上面我的问题。以上的回答。至今没有解决 我的问题啊。。加油啊。。大家。
      

  9.   

    转换?不大明白。
    你可以直接用dataview作为控件的数据源阿
    接着写就是
    datagride1.datasource = dv
    datagride1.databind()
      

  10.   

    DataView dv = dt.DefaultView;
    dv.RowFilter = "你的select(where)中where的值";
    这时dv中能够访问到的记录就是你所需要的新表中的记录了。
    为了与DataTable同样方式访问,可以使用
    DataViewRow dr = dv[i];
    这时的dr与DataTable中的DataRow在使用方法上无任何区别了。
      

  11.   

    楼上的,我是实现的一个接口,必须得返回DataTable..
    怎么 办??
      

  12.   

    DataTable dt;
    datatable dt2;...dataview dv = new dataview(dt.defaultview);
    dv.rowfilter = "你的条件";
    dt2 = dv.table;
    return dt2;可以了么?
      

  13.   

    哈哈。我刚刚测试过了。
    七小的答案是错的。因那个DataView.Table是个引用。指向的还是原来的那个DataTable
    所以,得到的其实还是原来的那个dt,还是十条记录。在这个问题中体现的是引用与copy的概念吧。
      

  14.   

    确实。不好意思了。
    可以试试使用下面的方法public static DataTable CreateTable(DataView obDataView)
    {
    if (null == obDataView)
    {
    throw new ArgumentNullException
    ("DataView", "Invalid DataView object specified");
    } DataTable obNewDt = obDataView.Table.Clone();
    int idx = 0;
    string [] strColNames = new string[obNewDt.Columns.Count];
    foreach (DataColumn col in obNewDt.Columns)
    {
    strColNames[idx++] = col.ColumnName;
    } IEnumerator viewEnumerator = obDataView.GetEnumerator();
    while (viewEnumerator.MoveNext())
    {
    DataRowView drv = (DataRowView)viewEnumerator.Current;
    DataRow dr = obNewDt.NewRow();
    try
    {
    foreach (string strName in strColNames)
    {
    dr[strName] = drv[strName];
    }
    }
    catch (Exception ex)
    {
    Trace.WriteLine(ex.Message);
    }
    obNewDt.Rows.Add(dr);
    } return obNewDt;
    }
      

  15.   

    可以。楼上的方法是可以的。其实我使用的是:
    dt是原DataTable
    where是查询字符串
    order是排序字符串DataRow[] drs=dt.Select(where,order);
    DataTable dt2=dt.Copy();
    dt2.Rows.Clear();
    foreach(DataRow row in drs)
         {
    DataRow row2=dt2.NewRow();
    for(int i=0;i<row2.Table.Columns.Count;i++)
    row2[i]=row[i];
             dt2.Rows.Add(row2);
          }
    return dt2;不过,我实在是觉得这样的方法太浪费了。因为这样的操作会相当频繁
    我在想,这里面是否有个更好的。最有效率的方法解决。
    因为已经得到那个Row,可是DataRow没有Clone功能。所以郁闷呢!!!
    谢谢楼上的...不过,我期待能得到最有效率的代码。
      

  16.   

    DataView dv = new DataView(ds.Tables["TableName"]);
    dv.RowFilter="FieldName LIKE '%" + 美女 + "%'"; 
    DataGrid.DataSource=dv;
      

  17.   

    对不起,没有测试乱说话,见笑了
    不过刚才看了一下,好象DataTable没有公开一个可以实现这个功能的方法