在 VB.NET 中将 Gridview 转换为 DataTable

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14837044/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 12:18:24  来源:igfitidea点击:

Converting Gridview to DataTable in VB.NET

vb.netgridviewdatatable

提问by lawphotog

I am using this function to create datatable from gridviews. It works fine with Gridviews with AutoGenerateColumns = False and have boundfields or template fileds. But if I use it with Gridviews with AutoGenerateColumn = True I only get back an empty DataTable. Seems Gridview viewstate has been lost or something. Gridview is binded on PageLoad with If Not IsPostback. I can't think of anything else to make it work. Hope someone can help me.

我正在使用此函数从 gridviews 创建数据表。它适用于具有 AutoGenerateColumns = False 的 Gridviews,并且具有边界字段或模板文件。但是如果我将它与 AutoGenerateColumn = True 的 Gridviews 一起使用,我只会得到一个空的 DataTable。似乎 Gridview 视图状态已经丢失或什么的。Gridview 使用 If Not IsPostback 绑定在 PageLoad 上。我想不出还有什么可以让它发挥作用。希望可以有人帮帮我。

Thanks,

谢谢,

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

回答by DanFromHamburg

Slight modification to your function above. If the autogenerate delete, edit or select button flags are set, the values for the fields are offset by one. The following code accounts for that:

对上面的函数稍作修改。如果设置了自动删除、编辑或选择按钮标志,则字段的值将偏移 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