ASPX Обновление текстового поля управления во время многоэтапного процесса - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть веб-форма, которая (будет) выполняет процесс импорта из книги Excel в базу данных.Есть несколько шагов, связанных с импортом, и я создал DLL, которая выполняет основную часть работы.Я встроил событие в класс, чтобы из автономной программы (консоли) или веб-формы можно было отображать сообщения о событиях / сообщениях об ошибках.

namespace VDKItemImportToCM
{
    public class VDKItemImporter
    {
        /// <summary>
        /// Delegate methods for event handling
        /// </summary>  
        public event EventHandler<StdMessageArgs> onSendMessage;
        public class StdMessageArgs : EventArgs
        {
            public StdMessageArgs(string iMsg, char sType)
            { Msg = iMsg; ErrorType = sType; }
            public string Msg { get; set; }
            public char ErrorType { get; set; }
        }
        public string AssemblyVersion = "";
        public string AssemblyName = "";

        ... // lots of code to process import

         private void log(string msg, char errType)
        {
            onSendMessage(this, new StdMessageArgs(msg, errType));
        }
    }
}

На странице веб-формы у меня есть текстовое поле, в котором выводятся выходные данные.из объекта импорта через срабатывание события объекта.Вот код aspx:

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <table style="width: 800px">
        <tr>
            <td align="center" colspan="2" height="40px">
                                            <asp:Label ID="Label1" runat="server" Text="Van Dyke Item Import to CM" class="heading1" Font-Bold="False" Font-Names="Verdana" ForeColor="Blue" Font-Size="Medium"></asp:Label>
                                        </td>
        </tr>
        <tr>
            <td colspan="2" style="padding-bottom: 30px; margin-bottom: 30px">
                <asp:Label ID="lblImportMessages" runat="server"></asp:Label>
            </td>
        </tr>
        <tr>
            <td style="width: 187px">
                <asp:Label ID="Label2" runat="server" Text="Select Excel Import File:"></asp:Label>
            </td>
            <td>
                <asp:FileUpload ID="fulExcelFile" runat="server" Width="315px" />
            </td>
        </tr>
        <tr>
            <td colspan="2" height="45px">
                <asp:Button ID="btnImportItems" runat="server" OnClick="btnImportItems_Click" Text="Import Items" />
            </td>
        </tr>
        <tr>
            <td colspan="2">Import Progress</td>
        </tr>
        <tr>
            <td colspan="2">
                <asp:TextBox ID="txtDisplayProgress" runat="server" Height="400px" TextMode="MultiLine" Width="100%"></asp:TextBox>
            </td>
        </tr>
    </table>
</asp:Content>

Наконец, в бэкэнд-коде, который я начинаю с нажатия кнопки, вызовите функцию main для обработки импорта с помощью методов объекта.Настраиваемое событие для объекта помещает текст прогресса в текстовое поле дисплея

protected void btnImportItems_Click(object sender, EventArgs e)
{
    processClientExcel(fulExcelFile);
}
protected void itemImport_OnMsg(object sender, VDKItemImporter.StdMessageArgs e)
{
    string errorType = "";
    switch (e.ErrorType)
    {
        case 'i':
            errorType = "Info: ";
            break;
        case 'e':
            errorType = "Error: ";
            break;
        case 'f':
            errorType = "Fatal: ";
            break;
    }

    txtDisplayProgress.Text += errorType + e.Msg + "\r\n";
}

. Затем это фрагмент кода, в котором вызывается метод объекта (вызывающий событие и добавление информации на экран).текст:

  private void processClientExcel(FileUpload uploadFile)
    {
        .... \\ some code before this
        \\ the itemImport object fires the event shown above
        if (!itemImport.setupStagingTables(Server.MapPath("~/SupData/") + filename))
        {
            txtDisplayProgress.Text += "The staging tables where not set up correctly.  Stopping import now.";
            return;
        }
    }

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

Таким образом, вопрос заключается в том, есть ли способ создать немедленное обновление текстового поля дисплея при возникновении события объекта.

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