我试图在我的网络表单中实现一个简单的等待功能,它可以工作,但不是我想做的。 我的代码是这样的:
for(int i = 0; i<5; i++)
{
Label1.Text = "Invio: " +i;
System.Threading.Thread.Sleep(6000);
}
问题是标签文字没有&#39;每6秒更换一次。
此脚本应使用30秒并以这种方式更改标签文本:
&#34; Invio:我&#34;每6秒钟一次。
相反,它会等待6秒,然后更改&#34; Invio 4&#34;中的文字。
为什么?
答案 0 :(得分:1)
发生这种情况的原因是视图状态。在渲染页面之前,执行后端代码,完成后,DOM开始渲染,然后页面就绪。这意味着您的页面每隔N秒就不会刷新标签值,因为它已经设置好了。如果要动态更改此值,则应使用一些前端方法作为JavaScript或jQuery。如果你想要这种方法 - 评论,那么我可以为你做一个小提琴。 这对你有帮助 - ViewState
这是一个小提琴,可以检查你是否想要这样的东西 - Fiddle demo
var count = 1;
time = setInterval(function(){
document.getElementById("label1").innerHTML="Indio: " + count;
count+= 1;
if (count == 5)
{
clearInterval(time);
}
},6000);
答案 1 :(得分:0)
这样的后端:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Timer1_Tick(object sender, EventArgs e)
{
Label txt = Label1;
int i = Convert.ToInt32(txt.Text);
if (i == 4)
{
Timer1.Enabled = false;
}
else
{
i++;
Label1.Text = i.ToString();
}
}
}
和前端是这样的:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Enabled="true" Interval="6000">
</asp:Timer>
<asp:Label ID="Label2" runat="server" Text="Invio: "></asp:Label>
<asp:Label ID="Label1" runat="server" Text="0"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>
</asp:UpdatePanel>
</asp:Content>
这将循环5次,间隔为6秒。
页面上的计时器将触发回发,服务器端将执行并将更新更新面板。
答案 2 :(得分:0)
不幸的是,没有简单的方法可以完全使用基本的Asp.Net webforms(除非你使用Asp.Net Webforms AJAX - 我个人觉得非常困惑)。
假设您正在尝试向用户提供一些反馈,关于长时间运行的操作,我会使用javascript(例如使用JQuery Ajax)和一个简单的页面来轮询任务是否完成,然后重定向到结果页面。