none
请问如何使用Visual Web Developer2010和VB.NET语言制作出一个考试倒计时器呢? RRS feed

答案

  • 突然想到:使用Timer会导致页面不断刷新,即便使用AJAX无刷新窗口,由于使用全局静态变量,如果不同人员登录时间不同,则剩余时间却一致,造成不公平。因此使用js方法(自认为最佳方法):

    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="VBNET.WebForm1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
        </form>
    </body>
    <script type="text/javascript">
        var tt;
        var hours = 0;
        var minutes = 0;
        var seconds = 0;
        if (window.name == "") {
            window.name = "2,0,0";     //此变量不会随着刷新页面而自动销毁,设置初始化时间
            //以后全部从HiddenField中取出数据
        hours = window.name.split(",")[0];
            minutes = window.name.split(",")[1];
            seconds = window.name.split(",")[2];
        }
        tt = self.setInterval(AutoTimerClick, 1000);

        //分离获取时、分、秒

        function AutoTimerClick() {

            seconds--;
            if (hours <= 0 && minutes <= 0 && seconds <= 0) {
                alert("时间到!");
                clearInterval(tt);
                window.close();
            }
            if (minutes <= 0) {
                hours -= 1;
                minutes = 59;
                seconds = 59;
            }
            if (seconds <= 0) {
                minutes -= 1;
                seconds = 59;
            }
            window.name= hours + "," + minutes + "," + seconds;
            document.getElementById('<%=Label1.ClientID %>').innerHTML = hours + "小时" + minutes + "分钟" + seconds + "秒";
        } 
    </script>
    </html>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月5日 7:06

全部回复

  • 尝试过使用Timer控件和ScriptManager控件和label控件。但还是不得其解。开始怀疑是否能使用Timer控件进行制作倒计时器了。

    qianghuishi

    2012年3月3日 7:40
  • 目前使用的源代码如下

    Public Class example
        Inherits System.Web.UI.Page
        Dim hours As Integer = 2
        Dim minutes As Integer = 0
        Dim seconds As Integer = 0

     Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    If seconds > 0 Then
                seconds -= 1
            End If
            If seconds <= 0 And minutes > 0 Then
                minutes = minutes - 1
                seconds = 59
            End If
            If seconds <= 0 And minutes <= 0 And hours > 0 Then
                hours = hours - 1
                minutes = 59
                seconds = 59
            End If
            Label1.Text = hours & "时" & minutes & "分" & seconds & "秒"
        End Sub


        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Timer1.Enabled = False Then
                Button1.Text = "停止"
                Timer1.Enabled = True
            Else
                Button1.Text = "开始"
                Timer1.Enabled = False
            End If
        End Sub
    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     Label1.Text = hours & "时" & minutes & "分" & seconds & "秒"
    End Sub
    End Class


    qianghuishi

    2012年3月3日 7:43
  • 等了一天没人理自己顶一下!

    qianghuishi

    2012年3月4日 13:47
  • 每天顶一下!

    qianghuishi

    2012年3月4日 23:42
  • 移到ASP.NET 论坛。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月5日 5:04
  • 原因在于你的hours,minutes和seconds都是dim类型的,这样的话每次Timer_Tick,都会导致代码重复运行,始终你的hours,minutes和seconds都是一开始的数值。

    Public Class WebForm1
        Inherits System.Web.UI.Page
        Shared hours As Integer = 2
        Shared minutes As Integer = 0
        Shared seconds As Integer = 0

        Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgsHandles Me.Load
            If Not IsPostBack Then
                Label1.Text = hours & "时" & minutes & "分" & seconds & "秒"
            End If
        End Sub

        Protected Sub Button1_Click(sender As Objecte As EventArgsHandles Button1.Click
            If Button1.Text = "开始" Then
                Button1.Text = "停止"
            Else
                Button1.Text = "开始"
            End If
            Timer1.Enabled = Not Timer1.Enabled
        End Sub

        Protected Sub Timer1_Tick(sender As Objecte As EventArgsHandles Timer1.Tick
            If hours <= 0 And minutes <= 0 And seconds <= 0 Then
                Timer1.Enabled = False
                Button1.Enabled = False
            Else
                If (minutes <= 0Then
                    hours -= 1
                    minutes = 59
                    seconds = 59
                End If
                If (seconds <= 0Then
                    minutes -= 1
                    seconds = 59
                End If
            End If
            Label1.Text = hours & "时" & minutes & "分" & seconds & "秒"
            seconds -= 1
        End Sub
    End Class

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此

    2012年3月5日 5:25
  • 您好

    參考以下代碼,使用 DateTime 會比較容易

    Partial Public Class _Default
        Inherits System.Web.UI.Page
    
        Shared dtTime As New DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 2, 0, 0)
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Label1.Text = dtTime.ToString("HH时mm分ss秒")
        End Sub
    
        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
            If Timer1.Enabled = False Then
                Button1.Text = "停止"
                Timer1.Enabled = True
            Else
                Button1.Text = "开始"
                Timer1.Enabled = False
            End If
        End Sub
    
        Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
            dtTime = dtTime.AddSeconds(-1)
            Label1.Text = dtTime.ToString("HH时mm分ss秒")
        End Sub
    End Class

    歡迎參觀我的Blog.NET菜鳥自救會

    2012年3月5日 6:15
  • 突然想到:使用Timer会导致页面不断刷新,即便使用AJAX无刷新窗口,由于使用全局静态变量,如果不同人员登录时间不同,则剩余时间却一致,造成不公平。因此使用js方法(自认为最佳方法):

    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="VBNET.WebForm1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
        </form>
    </body>
    <script type="text/javascript">
        var tt;
        var hours = 0;
        var minutes = 0;
        var seconds = 0;
        if (window.name == "") {
            window.name = "2,0,0";     //此变量不会随着刷新页面而自动销毁,设置初始化时间
            //以后全部从HiddenField中取出数据
        hours = window.name.split(",")[0];
            minutes = window.name.split(",")[1];
            seconds = window.name.split(",")[2];
        }
        tt = self.setInterval(AutoTimerClick, 1000);

        //分离获取时、分、秒

        function AutoTimerClick() {

            seconds--;
            if (hours <= 0 && minutes <= 0 && seconds <= 0) {
                alert("时间到!");
                clearInterval(tt);
                window.close();
            }
            if (minutes <= 0) {
                hours -= 1;
                minutes = 59;
                seconds = 59;
            }
            if (seconds <= 0) {
                minutes -= 1;
                seconds = 59;
            }
            window.name= hours + "," + minutes + "," + seconds;
            document.getElementById('<%=Label1.ClientID %>').innerHTML = hours + "小时" + minutes + "分钟" + seconds + "秒";
        } 
    </script>
    </html>

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月5日 7:06
  • 跟控件压根无关,使用System.Timer 下的FCL就可以,页面简单的用html控件就行,为啥你们做点程序,就会找控件呢?

    控件只是为了松耦合,其他啥也干不了,你实现可以借助微软FCL的控件,但更多需要自己来实现啊

    服务器端就用 System.Timer

    js客户端就用setinterval

    2012年3月5日 16:32
    版主