see:SqlConnection cnn=new SqlConnection("server=BEAR;user id=sa;initial catalog=123;persist security info=True;");
cnn.Open();

SqlDataAdapter da=new SqlDataAdapter("select * from ta",cnn);
DataTable dt=new DataTable();
da.Fill(dt);
dt.DefaultView.RowFilter="id>'4'";

DataTable TempTable=dt.Clone();

for(int i=0;i<dt.DefaultView.Count;i++)
{     
DataRow row=TempTable.NewRow();
for(int j=0;j<TempTable.Columns.Count;j++)
{
                row[j]=dt.DefaultView[i][j];
}
         TempTable.Rows.Add(row);
}
                
dataGrid1.DataSource=TempTable;cnn.Close();

解决方案 »

  1.   

    winForm 无需任何转换,原来的DataTable已经变了,
      private DataTable dt;
      ....Form_Load(...)
      {
          ...
         dataGrid1.DataSource = dt;
       }
       ... button1_click(...)
      {
         int a = dt.Rows.Count;
       }webForm的话就很不一样,页面刷新数据源就没了,无论你 DataView a = dataGrid1.DataSource as DataView都是取不到的
      

  2.   

    不好意思,偶的方法苯了,楼上的说的对。直接用DataTable TempTable=dt;就是dt.DefaultView挑选后的数据了。请教一下暴走兄,如果dt有8条记录,dt.DefaultView.RowFilter后是4条记录:然后直接用DataTable TempTable=dt也是RowFilter后的那4条记录;但这时Console.Write(dt.Rows.Count);显示却是8条,就是说dt还是8条记录,为什么直接DataTable TempTable=dt;付值得到的却是其中的4条记录,它是怎么工作的啊。
      

  3.   

    主要是行状态的问题,DataTable的运作很依赖于这一点;
    举个例子,DataTable1.Rows[0].Delete();实际上这一行并没有真的删除了,而是将这一行的状态改为System.Data.DataRowState.Deleted,绑定的时候就自动跳过,不显示这一行;对你上面的例子,试一下
    Console.Write(dt.Rows.Count);
    dt.AcceptChanges();
    Console.Write(dt.Rows.Count);
      

  4.   

    老大。我试了呀,怎么不行呢,DataTable TempTable=dt后显示的是dt.DefaultView挑选后的数据,可存储的依然是dt原来的数据呀
      

  5.   

    对不起,我想问一下,dt.AcceptChanges()只是针对有行的add,delete等操作后才有用,可针对过滤和排序没有效果呀,请问怎么回事
      

  6.   

    不会吧:SqlConnection cnn=new SqlConnection("server=BEAR;user id=sa;initial catalog=123;persist security info=True;");
    cnn.Open();

    SqlDataAdapter da=new SqlDataAdapter("select * from ta",cnn);
    DataTable dt=new DataTable();
    da.Fill(dt);
    dt.DefaultView.RowFilter="id>'4'";

    DataTable TempTable=dt;
    dataGrid1.DataSource=TempTable;cnn.Close();我试过的绝对没问题。
    ---------------------------------
    你说你的代码是:
    myDs.Tables[0].DefaultView.RowFilter = @"从业人口女> 200";
    myDt = myDs.Tables[0];改为下面的试一下:
    myDs.Tables[0].DefaultView.RowFilter = "从业人口女> '200'";
      

  7.   

    看来又要麻烦暴走兄了,暴走兄说是依据RowState来决定的,可是我在dt.DefaultView.RowFilter="id>'4'";
    后写如下面的代码,显示全是unchange的,而且RowState并没有那个值是代表被筛选掉的
    foreach(DataRow row in dt.Rows)
    Console.WriteLine(row.RowState);
      

  8.   

    搞错了,DataTable TempTable=dt;是全部复制的。而不是只复制4个,只不过是因为把其中的DefaultView.RowFilter也复制过去了,所以在datagrid1中还只是显示4行,不信的话可以测试一下TempTable.Count属性。看来如果要只复制4行,还是用我的第一个代码了。
      

  9.   

    把dataview转换成datatable:public DataTable DataViewToDataTable(DataView dv) {
    DataTable dt = dv.Table.Clone();
    foreach(DataRowView drv in dv){
    DataRow dr = dt.NewRow();
    for(int x=0; x < dv.Table.Columns.Count; x++) {
    dr[x] = drv[x].ToString();
    }
    dt.Rows.Add(dr);
    }
    return dt;
    }
      

  10.   

    谢谢楼上的各位兄弟!!!!!!!!!!!!!!!!!!!!!!!
    哎!可是如果我一个DataView有10万条以上的数据,如用ADD填充是不是有点慢呀????
    还有没有真接转换的方法呀!
      

  11.   

    DataView有10万条以上的数据。10万条别说转为其他的datatable了,你从数据库中读取这个10万条fill到datatable中也是很慢的。还要把10万条复制到另一个datatable中,别说速度了,内存都不知道要占去多少了!!!