Как я могу сохранить данные в памяти и использовать другое событие нажатия кнопки для отображения данных? - PullRequest
0 голосов
/ 15 апреля 2020

Вот код, но в событии щелчка ButtonExport набор данных имеет значение NULL. Как передать DataTable в Sub ButtonExport_Click? Я не хочу хранить в сеансе, так как данные слишком большие

Вот класс clsGlobalVarriable

Public Class clsGlobalVariable

    Private _gdt As DataTable

    Public Property globalDataTable As DataTable
        Get
            Return _gdt
        End Get
        Set(ByVal value As DataTable)
            _gdt = value
        End Set
    End Property

End Class

Вот код От frmTest:

Public Class frmTest
    Inherits System.Web.UI.Page

    Private gdt As New clsGlobalVariable

    Protected Sub ButtonInactivePC_Click(sender As Object, e As EventArgs) Handles ButtonInactivePC.Click

        Try
            Dim func As New clsFunction
            Dim command As String = "Get-ADComputer -Filter { OperatingSystem -NotLike '*Windows Server*'} -Property * | select Name, CanonicalName, operatingSystem, LastLogonDate, Description, whenChanged | Where {($_.LastLogonDate -lt (Get-Date).AddDays(-90)) -and ($_.LastLogonDate -ne $NULL)}"

            Dim arr As New ArrayList
            arr.Add("Name")
            arr.Add("CanonicalName")
            arr.Add("operatingSystem")
            arr.Add("LastLogonDate")
            arr.Add("whenChanged")
            arr.Add("Description")

            gdt.globalDataTable = func.PSObjectToDataTable(command, arr)
            Me.GridView1.DataSource = gdt.globalDataTable
            Me.GridView1.DataBind()

        Catch ex As Exception
            Me.LabelDebug.Text = "Button Click" + ex.Message
        End Try


    End Sub

    Protected Sub ButtonExport_Click(sender As Object, e As EventArgs) Handles ButtonExport.Click

        Dim func As New clsFunction
        Dim dt As New DataTable
        dt = (DirectCast(Me.GridView1.DataSource, DataTable))
        Me.LabelDebug.Text = "Global Data Table Count = " & dt.Rows.Count

    End Sub

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я решил использовать альтернативу для экспорта в Excel, я не собираюсь передавать DataTable, вместо этого я передаю GridView в функцию экспорта в Excel

Добавьте следующий подпункт справа после Page_load это позволяет избежать ошибки GridView

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
End Sub

Вот код:

Public Sub ExportFromGridview(ByVal gv As GridView, ByVal response As HttpResponse

    response.Clear()
    response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>")
    response.AddHeader("content-disposition", "attachment;filename=" & Now & ".xls")
    response.ContentType = "application/vnd.xls"
    Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter()
    Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    gv.RenderControl(htmlWrite)

    response.Write(stringWrite.ToString())
    response.End()

End Sub
0 голосов
/ 15 апреля 2020

При работе с веб-страницами, которые показывают данные пользователю, и пользователь предпринимает некоторые действия с этими данными, вам необходимо либо сохранить данные где-нибудь на своем компьютере, на своем компьютере (сервере) или полагаться на тот факт, что они все еще хранятся в компьютере, с которого вы это получили. В качестве процесса, который вы предприняли:

  • Вы генерируете сетку из запросов AD
  • Вы отправляете сетку на компьютер клиента - поэтому она сохраняется там в виде визуального представления (и, возможно, также ViewState)
  • Он все еще хранится в AD, где вы его получили
  • Вы также можете как-то локально хранить его на сервере - Session, DB, текстовый файл, что угодно

Определите, какой из них использовать, когда пользователь нажимает кнопку Экспорт:

  • Извлечь его из состояния просмотра или других данных, которые были отправлены пользователю - для этого вам придется кодировать вещи поэтому он возвращается от пользователя
  • Получите его снова из AD - это легко сделать; Вы сделали это один раз и отправили пользователю в HTML. Получение его снова и повторная отправка пользователю на этот раз в качестве CSV на самом деле ничем не отличается от того, когда вы делали это в первый раз
  • Восстановите его с того места, где вы хранили его на сервере

Выберите первое, если ваш пользователь собирается изменить данные или экспортировать только некоторые из них - данные, которые он отправляет вам обратно, должны указывать, какие биты он хочет экспортировать.

Выберите второй вариант, если вы хотите простой жизни, и это просто прямой экспорт, без редактирования или подмножества данных. Напишите один метод, который извлекает данные из AD, а затем использует их в любом месте, один для формирования HTML / заполнения сетки, а другой - для отправки файла пользователю. Не зацикливайтесь на «ну, я уже получил эти данные один раз, это бесполезно, чтобы получить их снова» - никто не пишет страницу входа и не думает, что «я когда-нибудь найду пользователя из БД только один раз, затем заставить сервер запоминать данные для входа навсегда и использовать их в следующий раз при запросе входа в систему »- они сохраняют данные в БД и проверяют их каждый раз при входе в систему. БД хранят данные и выполняют одни и те же запросы снова и снова. Это ничем не отличается

Вы, вероятно, не выбрали бы третий вариант по причинам, уже упомянутым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...