Экспорт в csv с помощью vb.net , gridview1.columns.count равно 0 столбцам

#vb.net #csv #gridview #export

#vb.net #csv #просмотр сетки #экспорт

Вопрос:

Я создаю таблицу данных в своем коде, а затем привязываю gridview к этой таблице данных. Мои данные отображаются в gridview идеально. Когда я использую функцию, которую я нашел на этом форуме, для экспорта в csv, экспортированный файл пуст, и я заметил, что он показывает, что в gridview было 0 столбцов. Я попытался установить для автоматически создаваемых столбцов значение false, но это приводит к тому, что в моем gridview не отображаются какие-либо данные, и все равно экспорт остается пустым.

 Imports System.IO

Partial Class Default3
    Inherits System.Web.UI.Page
    Dim dt As New Data.DataTable


    Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
        ' Verifies that the control is rendered

    End Sub

    Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
        Response.Clear()
        Response.Buffer = True
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv")
        Response.Charset = ""
        Response.ContentType = "application/text"
        GridView1.AllowPaging = False
        GridView1.DataSource = dt
        GridView1.DataBind()
        Dim sb As New StringBuilder()
        For k As Integer = 0 To GridView1.Columns.Count - 1
            'add separator
            sb.Append(GridView1.Columns(k).HeaderText   ","c)
        Next
        'append new line
        sb.Append(vbCr amp; vbLf)
        For i As Integer = 0 To GridView1.Rows.Count - 1
            For k As Integer = 0 To GridView1.Columns.Count - 1
                'add separator
                sb.Append(GridView1.Rows(i).Cells(k).Text   ","c)
            Next
            'append new line
            sb.Append(vbCr amp; vbLf)
        Next
        Response.Output.Write(sb.ToString())
        Response.Flush()
        Response.End()
    End Sub

    Protected Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
        Dim ta As New dsahonorlTableAdapters.MIEMBROS1TableAdapter
        Dim ds As New dsahonorl.MIEMBROS1DataTable
        Dim r As dsahonorl.MIEMBROS1Row
        ds = ta.GetData()

        dt.Columns.Add("Nombre", GetType(String))
        dt.Columns.Add("Id", GetType(String))
        dt.Columns.Add("Especialidad", GetType(String))
        Dim nombre, id, espe As String

        For Each r In ds
            nombre = r.NOMBREMIEMBRO
            espe = r.ESPECIALIDAD
            id = r.IDMIEMBRO
            dt.Rows.Add(nombre, id, espe)
        Next
        GridView1.DataSource = dt
        GridView1.DataBind()

    End Sub
End Class
  

Ответ №1:

В Button2_Click вы dt заполняете данные и привязываете их к GridView1 — я предполагаю, что это та часть, которая работает. Тем не менее, Button1_Click вы повторно привязываетесь dt к GridView1 , но на данный момент dt будет пустым. Это связано с тем, что при каждой обратной отправке на сервер будет создаваться новый экземпляр вашего Default3 класса page .

Вы можете перезагрузить его так dt Button1_Click же, как вы его загружаете Button2_Click , но вам может сойти с рук просто отказ от повторной привязки GridView1 (извините, сейчас не перед Visual Studio, поэтому я не могу это проверить), поскольку значения в элементах управления отправляются обратно на сервер в представлениисостояние. т.е. Попробуйте удалить эти строки из Button1_Click :

 GridView1.DataSource = dt
GridView1.DataBind()
  

Обновить

Хорошо, значит, я ошибался, источники данных не запоминаются при обратной передаче (хотя другие свойства элемента управления, например TextBox.Text , есть). Извините за это! Итак, вам нужно GridView каждый раз заново привязывать свой файл, и я считаю, что это проще всего сделать Page.Load . Вы можете вручную сохранить свой DataTable in ViewState или каждый раз повторно запрашивать его (если он очень большой, ViewState размер может выйти из-под контроля). Также кажется GridView , что столбцы не создаются вовремя, возможно, до тех пор, пока они не будут отображены позже в конвейере.

Вот рабочий пример, показывающий привязку, а также использование DataTable для экспорта.

GridTest.aspx

 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="GridTest.aspx.vb" Inherits="SO_GridViewCSV.GridTest" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Export" />
        </div>
        <div>
            <asp:GridView ID="GridView1" runat="server"></asp:GridView>
        </div>
    </form>
</body>
</html>
  

GridText.aspx.vb

Общедоступный класс GridTest наследует System.Web.UI.Page

     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            ViewState("GridViewData") = GetData()
        End If
        GridView1.DataSource = ViewState("GridViewData")
        GridView1.DataBind()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Response.Clear()
        Response.Buffer = True
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.csv")
        Response.Charset = ""
        Response.ContentType = "application/text"
        Dim sb As New StringBuilder()
        Dim data = DirectCast(ViewState("GridViewData"), DataTable)
        ' Add headers
        sb.AppendLine(String.Join(","c, data.Columns.Cast(Of DataColumn)().Select(Function(x) x.ColumnName)))
        ' Add data rows
        For Each r As DataRow In data.Rows
            sb.AppendLine(String.Join(","c, r.ItemArray))
        Next
        Response.Output.Write(sb.ToString())
        Response.Flush()
        Response.End()
    End Sub

    Private Function GetData() As DataTable
        Dim dt = New DataTable()
        dt.Columns.Add("ColA", GetType(String))
        dt.Columns.Add("ColB", GetType(String))
        dt.Columns.Add("ColC", GetType(String))
        For i = 1 To 10
            dt.Rows.Add("A" amp; CStr(i), "B" amp; CStr(i), "C" amp; CStr(i))
        Next
        Return dt
    End Function

End Class
  

Комментарии:

1. Спасибо, Марк, это все еще не работает, и я также попытался добавить код для построения таблицы данных перед экспортом, и это тоже не сработало.

2. @user3483354 Хм, я полагаю, если вы повторно запросите базу данных, вы всегда можете использовать DataTable для создания csv вместо GridView . Я настрою тестовый проект, чтобы понять, почему GridView он не запоминает свои данные.

3. Я думал об экспорте таблицы данных в csv, хорошая идея, как это будет выглядеть? Еще раз спасибо,

4. Отличная оценка, большое вам спасибо, работает как шарм!