我正在尝试制作一个进度条,以便在一些“修改”期间显示我们正在从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();
}
}
是否有人知道一种简单的方法可以处理这样的事情?如果这看起来不是一个可行的解决方案,我也会接受其他建议。
非常感谢!
答案 0 :(得分:1)
在服务器端,progressPercent
的类型为HtmlGenericControl
,允许您获取/设置如下属性:
progressPercent.Attributes["value"] = (i / rows.Count).ToString();
或者,如果该属性尚未存在,则可能必须执行以下操作:
progressPercent.Attributes.Add("value", (i / rows.Count).ToString());
答案 1 :(得分:1)
您想要做的是将百分比存储在会话var Session["percent"]
中,并将Load
处理程序设置到更新面板,您可以在其中更新会话变量的进度。
在客户端,您可以使用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标头中,添加以下代码:
此代码在更新面板上调用内置的asp.net回发函数,它将触发更新面板的Load
处理程序而不刷新整个页面
<script type="text/javascript">
window.onload = function () {
setInterval("__doPostBack('<%=UpdatePanel1.ClientID%>', '');", 1000);
}
</script>
代码背后:
这是更新面板的加载处理程序,每次面板从aspx页面回发时都会触发,我们检查会话var是否存在,并设置标签文本:
protected void UpdatePanel1_Load(object sender, EventArgs e)
{
if (Session["percent"] != null)
{
Label_For_Server_Time.InnerText = Session["percent"].ToString();
}
}
这是你的功能,我们在一个单独的线程上运行它,不会阻止应用程序并相应地设置会话变量。
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();
}