2013-02-12 97 views
2

我正在使用此函数从gridviews创建数据表。它适用于带有AutoGenerateColumns = False的Gridviews并具有绑定字段或模板文件。但是,如果我将它与GridView一起使用,并且AutoGenerateColumn = True,那么我只能返回一个空的DataTable。好像Gridview的viewstate已经丢失了或者什么的。 Gridview绑定在PageLoad上,如果不是IsPostback。我想不出任何其他的东西来使它工作。希望可以有人帮帮我。将GridView转换为VB.NET中的DataTable

感谢,

Public Shared Function GridviewToDataTable(gv As GridView) As DataTable 

    Dim dt As New DataTable 

    For Each col As DataControlField In gv.Columns 
     dt.Columns.Add(col.HeaderText) 
    Next 

    For Each row As GridViewRow In gv.Rows 
     Dim nrow As DataRow = dt.NewRow 
     Dim z As Integer = 0 
     For Each col As DataControlField In gv.Columns 
      nrow(z) = row.Cells(z).Text.Replace(" ", "") 
      z += 1 
     Next 
     dt.Rows.Add(nrow) 
    Next 
    Return dt 

End Function 
+0

当AutoGenerateColumn = True意味着GridView正在从数据源(最类似于数据表)生成列。为什么不使用它? – AbZy 2013-02-12 16:29:54

+0

嗨AbZy,谢谢。它使用webservice返回的对象列表(反序列化xml字符串),我认为很难从GridView中获取DataTable。谢谢。 (加上Gridvew可以通过JQuery进行排序和修改,因此可以更改数据源。) – lawphotog 2013-02-12 16:40:38

回答

1

轻微修改上面的功能。如果设置了自动生成删除,编辑或选择按钮标志,则这些字段的值将偏移1。下面的代码说明了这一点:

Public Shared Function GridviewToDataTable(ByVal PassedGridView As GridView, ByRef Error_Message As String) As DataTable 
    '----------------------------------------------- 
    'Dim Tbl_StackSheets = New Data.DataTable 

    'Tbl_StackSheets = ReportsCommonClass.GridviewToDataTable(StackSheetsGridView) 

    '----------------------------------------------- 

    Dim dt As New DataTable 
    Dim ColInd As Integer = 0 
    Dim ValOffset As Integer 

    Try 

     For Each col As DataControlField In PassedGridView.Columns 
      dt.Columns.Add(col.HeaderText) 
     Next 


     If (PassedGridView.AutoGenerateDeleteButton Or PassedGridView.AutoGenerateEditButton Or PassedGridView.AutoGenerateSelectButton) Then 
      ValOffset = 1 
     Else 
      ValOffset = 0 
     End If 


     For Each row As GridViewRow In PassedGridView.Rows 
      Dim NewDataRow As DataRow = dt.NewRow 

      ColInd = 0 
      For Each col As DataControlField In PassedGridView.Columns 
       NewDataRow(ColInd) = row.Cells(ColInd + ValOffset).Text.Replace(" ", "") 
       ColInd += 1 
      Next 

      dt.Rows.Add(NewDataRow) 
     Next 

     Error_Message = Nothing 

    Catch ex As Exception 
     Error_Message = "GridviewToDataTable: " & ex.Message 
    End Try 


    Return dt 


End Function