已有一个DataGrid,并且已经绑定到某DataView或DataTable上了,我现在想倒过来,从这个datagrid里提取出他所绑定的对象,应该用什么方法?
我用DataView dv=(DataView)dg.DataSource;这样不行,弄出来的dv是空。或者谁能告诉我,如何创建一个datatable,将现有的datagrid数据完全复制进来,最好不要用什么逐行逐列循环然后复制的办法,有没有更好的捷径?

解决方案 »

  1.   

    DataTabl dt;
    dt=DataGrid.DataSoure;
      

  2.   

    dg.DataSource负值的时候,同时把DataSource存在一个ViewState里面
      

  3.   

    比如你已经绑定到一个DATATABLE上了,只要你没有销毁这个DATATABLE那么你就可以一直引用它,能否告知你为何要像你那么做?
      

  4.   

    datasource 属性 获取或设置源,该源包含用于填充控件中的项的值列表。
    是啊,不明白楼主为什么要这么做啊?有很多方法可以的啊.
      

  5.   

    页面每次刷新的时候,DataSource都是要重新负值的,所以只能储存在ViewState里面
      

  6.   

    RadishRabbitGao() 的可以解决,但是这样会造成大量的数据被回发
    还有就是可以每次都去取这些数据,但是这样又会消耗数据库资源和读取数据的时间
    这些方法都个有利弊,看楼主如何取舍
      

  7.   

    回smoothwood,绑定datagrid是一个函数,已经执行完毕了。当datagrid显示出来以后,再需要对其datatable做一些处理,这就是我的需求。当然,可以把原来绑定时的datatable保存到static变量或session中,但这么做未免过于笨拙。
      

  8.   

    回radishrabbitgao,你说放在viewstate里?可是viewstate不是只能存储字符串的吗?难道他可以保存一个带数据结构的datatable对象?
      

  9.   

    我们可以将dataset对象串行化成一个包含数据的xml表示的string变量,然后再将它们存储在viewstate中,当从viewstate提取值后,再将它们还原为dataset类型.
      

  10.   

    viewstae似乎是有长度限制的吧……
      

  11.   

    viewstate中可以放置对象,用以下代码测试:
            If Not IsPostBack Then
                Dim conn As New SqlConnection("Server=localhost;user id=sa;password=ycm119;database=northwind;")
                Dim dad As New SqlDataAdapter("Select * from Categories", conn)
                Dim dst As New DataSet
                dad.Fill(dst)
                DataGrid1.DataSource = dst.Tables(0)
                DataGrid1.DataBind()
                viewstate("test") = dst
            Else
                DataGrid2.DataSource = CType(viewstate("test"), DataSet)
                DataGrid2.DataBind()
            End If
      

  12.   

    如果你觉得放在viewstate中不好,同时也不像去读数据库那么你可以把对象放在Cache中,这样可以很大提高效率