我正在尝试制作一个进度条,以便在我们对 Excel 文档中的 200,000 多行进行某些“修改”时显示。我只是想尝试一些简单的事情,但我似乎无法从进度标签中获取 value 属性。
例如,如果我有一些简单的事情,例如:
<asp:UpdatePanel ID="upnlPercent" runat="server">
<progress id="progressPercent" runat="server"></progress>
</asp:UpdatePanel>
还有:
public static void CleanExcelSheet()
{
for(int i = 0; i < rows.Count; i++)
{
... // Clean whatever
progressPercent.Value = i / rows.Count;
upnlPercent.Update();
}
}
有人知道我可以处理这样的事情的简单方法吗?如果这看起来确实不是一个可行的解决方案,我也愿意接受其他建议。
非常感谢!
最佳答案
您想要做的是将百分比存储在 session 变量 Session["percent"]
中,并为您的更新面板设置一个 Load
处理程序将更新 session 变量的进度。
在客户端,您可以使用 javascript 使更新面板回发并每隔一定的毫秒数进行更新。
要记住的重要一点是,在单独的线程上运行清理功能,这样它就不会阻止您的应用程序,并允许应用程序监听来自更新面板的回发。
以下是如何执行此操作的示例:
aspx:
这是我们的更新面板,其中有一个我们将更新的元素
<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load">
<ContentTemplate>
<label id="Label_For_Server_Time" runat="server"></label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" Text="Click Me" OnClick="Button1_Click" />
在您的 aspx header 中,添加以下代码:
此代码调用更新面板上内置的 asp.net 回发函数,它将触发更新面板的 Load
处理程序,而不刷新整个页面
<script type="text/javascript">
window.onload = function () {
setInterval("__doPostBack('<%=UpdatePanel1.ClientID%>', '');", 1000);
}
</script>
隐藏代码:
这是更新面板的加载处理程序,每次面板从 aspx 页面发回时都会触发,我们检查 session 变量是否存在,并设置标签文本:
protected void UpdatePanel1_Load(object sender, EventArgs e)
{
if (Session["percent"] != null)
{
Label_For_Server_Time.InnerText = Session["percent"].ToString();
}
}
这是您的函数,我们在单独的线程上运行它,以免阻止应用程序并相应地设置 session 变量。
public void CleanExcelSheet()
{
new Thread(delegate()
{
for (int i = 0; i < 100000000; i++)
{
//... your cleaning here
float _f = (float)i / 100000000;
Session["percent"] = _f;
}
}).Start();
}
protected void Button1_Click(object sender, EventArgs e)
{
CleanExcelSheet();
}
关于c# - 如何从后端代码访问进度标签的值属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24638278/