Я пишу веб-страницу в ASP.Net. В настоящее время у меня есть asp:Table
, который я использую как своего рода «журнал» для обработки вывода. Идея состоит в том, что пользователь выбирает несколько файлов и нажимает кнопку, и каждый файл «обрабатывается» журналом, показывающим, что происходит. Обработка происходит асинхронно.VB.Net «logger» asp: Таблица и asp: Динамическое асинхронное обновление UpdatePanel
Вот соответствующий сегмент обработки:
Protected Sub DoAsyncWork()
Dim count = 0
For Each row As GridViewRow In gvList.Rows
count = count + 1
If CType(row.FindControl("cbImport"), System.Web.UI.WebControls.CheckBox).Checked Then
push_to_log("")
push_to_log("Updating Active Projects +" + HttpUtility.HtmlDecode(row.Cells(1).Text).ToString.Substring(0, 30) + "...")
Dim xp(3) As Object
xp(0) = HttpUtility.HtmlDecode(row.Cells(0).Text)
xp(1) = HttpUtility.HtmlDecode(row.Cells(1).Text)
xp(2) = HttpUtility.HtmlDecode(row.Cells(2).Text)
xp(3) = 0
'oDC.UpdateData("Import_P3e_Project ", xp)
If (xp(3) <> 0) Then
push_to_log("Success: " + xp(3).ToString + " have been updated")
Else
push_to_log("Failure: " + xp(3).ToString + " activities updated")
End If
End If
Next
push_to_log("")
push_to_log("Import Complete!")
End Sub
Это, как я называю функцию рабочего процесса:
Protected Sub button_Import(sender As Object, e As EventArgs) Handles btnImport.Click
Dim t As New Thread(New ThreadStart(AddressOf DoAsyncWork))
t.Priority = Threading.ThreadPriority.Normal
t.Start()
push_to_log("Start Import")
End Sub
Путем, я добавляя вещи в журнал является динамически создавать строки и ячейки, затем добавив их к моему столу. Вот соответствующая подпрограмма:
Protected Sub push_to_log(ByVal str As String)
Dim newRow As TableRow = New TableRow
Dim newCell As TableCell = New TableCell
logArrayList.Add(str)
Me.ViewState.Add("arrayListInViewState", logArrayList)
newCell.Text = str
newCell.Style("Color") = "White"
newCell.ID = "cell" + (logArrayList.Count - 1).ToString
newRow.ID = "row" + (logArrayList.Count - 1).ToString
newRow.Cells.Add(newCell)
logTable.Rows.Add(newRow)
HiddenButton_Click(HiddenButton, New EventArgs())
'UpdateLogPanel.Update()
'UpdateLogPanel.Focus()
End Sub
У меня есть журнал сохраняющегося правильно, с помощью ViewState для хранения моей ArrayList данных и воссоздания полена постбэк. Соответствующая разметка для моего журнала выглядит следующим образом:
<asp:UpdatePanel ID="UpdateLogPanel" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="HiddenButton" />
</Triggers>
<ContentTemplate>
<div ID="Div1" class="DefinitionPanel" style="text-align:left;height:200px;overflow:hidden;" runat="server">
<span style="display:inline-block; width:100px;"></span>
<div class="scrollingtable">
<div>
<div id="viewContainer">
<asp:table id="logTable" runat="server" enableviewstate="false">
</asp:table>
</div>
</div>
</div>
</div>
<asp:Button ID="HiddenButton" runat="server" style="display:none;" />
</ContentTemplate>
</asp:UpdatePanel>
Я пытаюсь сделать мой asp:Table
обновления каждый раз, когда сообщение посылается к нему. Я думал, что возможность частичной обратной передачи и использование UpdatePanel
будет правильным решением, но мой журнал все равно ничего не выводит, пока весь процесс не завершится.
После того как я добавить сообщение к моему asp:Table
/журналу, я пытался дозвониться
UpdateLogPanel.Update()
, не кажется, чтобы сделать разницу. Наконец, я попробовал добавить asp:AsyncPostBackTrigger
и скрытую кнопку с надеждой на то, что он исправит все, но это не похоже. Вот что hiddenButton
событие выглядит следующим образом:
Protected Sub HiddenButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles HiddenButton.Click
UpdateLogPanel.Visible = True
End Sub
Любые руководства о том, как сделать мой журнал повторного рендеринга себя, когда я добавить сообщение к нему будет высоко ценится.
VB6.NET? Интересно. Время для редактирования ... – Bond