我有一个Web表单,它将(执行)从Excel工作簿到数据库的导入过程。导入涉及多个步骤,我创建了一个DLL来完成大部分工作。我在类中内置了一个事件,因此可以显示来自独立程序(控制台)还是Web表单处理/错误消息。
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));
}
}
}
在我的Web表单页面中,我有一个文本框,该文本框通过触发对象事件来捕获导入对象的输出。这是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;
}
}
我环顾四周,看到了使用针对updatepanels的计时器的示例,并且我不想使用进度条。我还看到,仅更新updatepanel不会立即更改显示。
问题是,有没有一种方法可以在对象事件触发时立即创建显示文本框的更新。