У меня есть веб-форма, которая (будет) выполняет процесс импорта из книги 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;
}
}
Я посмотрел вокруг и увидел примеры использования таймеров с панелями обновления, и я не хочу использовать индикатор выполнения. Я также увидел, что простое обновление панели обновления не приводит к немедленному обновлениюдисплей.
Таким образом, вопрос заключается в том, есть ли способ создать немедленное обновление текстового поля дисплея при возникновении события объекта.