2015-07-24 2 views
0

Я пишу веб-страницу в 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 

Любые руководства о том, как сделать мой журнал повторного рендеринга себя, когда я добавить сообщение к нему будет высоко ценится.

+0

VB6.NET? Интересно. Время для редактирования ... – Bond

ответ

0

Я решил реализовать с использованием пула вместо асинхронного метода.

Я по-прежнему использую asp: UpdatePanel. Вместо таблицы внутри UpdatePanel теперь я использую gridview и таймер. Когда срабатывает таймер, я пересвязать GridView, показывая тем самым любые новое содержание

ключевые компоненты, чтобы сделать эту работу:

Площадь вещи прочь с панели родительского обновления и главной страницы:

Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init 
    'set reference to master site page 
    mstr = CType(Master, Site) 

    'setup partial rendering so Log can update asynchronously 
    scriptManager = CType(mstr.FindControl("ScriptManager1"), ScriptManager) 
    scriptManager.EnablePartialRendering = True 
    scriptManager.AsyncPostBackTimeout = 28800 
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).UpdateMode = UpdatePanelUpdateMode.Conditional 
    CType(mstr.FindControl("UpdatePanel1"), UpdatePanel).ChildrenAsTriggers = False 
End Sub 

наценка для UpdatePanel выглядит

<asp:UpdatePanel ID="UpdateLogPanel" UpdateMode="Conditional" 
      RenderMode="Inline" ChildrenAsTriggers="false" runat="server"> 
        <ContentTemplate> 
         <%--The Gridview and other Hidden Fields--%> 
         <asp:Timer ID="myTimer" OnTick="timer_tick" runat="server" Interval="1000" Enabled="false"/> 
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="myTimer" EventName="Tick" /> 
        </Triggers> 
     </asp:UpdatePanel> 

Сработал механизм протоколирования осуществляется просто путем установки Mytime r.Enabled = True событие

timer_tick выглядит

Public Sub timer_tick(ByVal sender As Object, ByVal e As EventArgs) 
    generate_log() 

    //other logging logic (increment counters, "timeout" mechanism) 

    UpdateLogPanel.Update() 

End Sub