#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. Отличная оценка, большое вам спасибо, работает как шарм!