2017-02-04 4 views
0

У меня проблема с таймером внутри UpdatePanel. Я хочу установить обратный отсчет (35 минут), и когда я нажму кнопку, он начнет обратный отсчет, но ничего не произойдет, когда я нажму на него. Это внутри страницы контента, кстати.Как использовать таймер в MasterPage с помощью UpdatePanel?

ASP код:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<div class="container"> 
<div style="position:fixed; border:dotted 2px; z-index:1"> 
<asp:UpdatePanel ID="upTiempo" UpdateMode="Conditional" runat="server" ViewStateMode="Enabled"> 
    <ContentTemplate> 
     <i class="fa fa-clock-o fa-3x"></i><asp:Label ID="lbMins" CssClass="h2" runat="server" Text="35" Font-Bold="True"></asp:Label><asp:Label ID="lbPts" runat="server" CssClass="h2" Font-Bold="true">:</asp:Label> 
     <asp:Label ID="lbSecs" CssClass="h2" runat="server" Text="00" Font-Bold="True"></asp:Label> 
     <asp:Button ID="btnEmpezar" runat="server" Text="Empezar" OnClick="btnEmpezar_Click"/> 
     <asp:Timer ID="tmTimer" runat="server" Interval="1000" OnTick="tmTimer_Tick"></asp:Timer> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="tmTimer" EventName="Tick" /> 
    </Triggers> 
</asp:UpdatePanel> 
</div> 

А вот C# код:

int mins = 35; 
int secs = 0; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    tmTimer.Enabled = false; 
} 

protected void tmTimer_Tick(object sender, EventArgs e) 
{ 
    if (secs < 0) 
    { 
     secs = 59; 
     mins--; 
    } 

    if (secs < 10) 
     lbSecs.Text = "0" + secs; 
    else 
     lbSecs.Text = "" + secs; 

    if (mins < 10) 
     lbMins.Text = "0" + mins; 
    else 
     lbMins.Text = "" + mins; 

    if (secs == 0 && mins == 0) 
    { 
     lbMins.Text = "00"; 
     lbSecs.Text = "00"; 

     tmTimer.Enabled = false; 
    } 

    secs--; 

    upTiempo.Update(); 
} 

protected void btnEmpezar_Click(object sender, EventArgs e) 
{ 
    tmTimer.Enabled = true; 
} 

Я делаю что-то не так? Что-то не хватает? Должен ли я убить себя?

ответ

0

Убивать себя не помогло бы сейчас, не так ли?

В любом случае, ваш таймер находится внутри панели обновления. Если вы вызываете upTiempo.Update();, вся панель перезагружается, включая таймер. По умолчанию таймер отключен, поэтому ничего не происходит после запуска первого события тика.

Установите его так:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:Timer ID="tmTimer" runat="server" Interval="1000" OnTick="tmTimer_Tick"></asp:Timer> 
<div class="container"> 
<div style="position:fixed; border:dotted 2px; z-index:1"> 
<asp:UpdatePanel ID="upTiempo" UpdateMode="Conditional" runat="server" ViewStateMode="Enabled"> 
    <ContentTemplate> 
     <i class="fa fa-clock-o fa-3x"></i><asp:Label ID="lbMins" CssClass="h2" runat="server" Text="35" Font-Bold="True"></asp:Label><asp:Label ID="lbPts" runat="server" CssClass="h2" Font-Bold="true">:</asp:Label> 
     <asp:Label ID="lbSecs" CssClass="h2" runat="server" Text="00" Font-Bold="True"></asp:Label> 
     <asp:Button ID="btnEmpezar" runat="server" Text="Empezar" OnClick="btnEmpezar_Click"/> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="tmTimer" EventName="Tick" /> 
    </Triggers> 
</asp:UpdatePanel> 
</div> 

Таким образом, когда панель перезагружается, таймер остается нетронутым и продолжает работать, как ожидалось.

Надеется, что это помогает

+0

Ну ... Это ididn't work ... Я добавил точку останова, и когда страница загружается, она отправляет меня на главную страницу кода C# ... – OPMUANRK

+0

Спасибо за помощь, кстати, – OPMUANRK

+0

Хорошо, я не мог определить основные проблемы;) но, тем не менее, держите свои таймеры за пределами своих панелей обновления. – DerpyNerd

0

Ну, я думаю, я нашел решение ... Я просто хранил минуты и ИКС значения в переменный сеансе, так что ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     Session["mins"] = mins; 
     Session["secs"] = secs; 

     tmTimer.Enabled = true; 
    } 
} 

protected void tmTimer_Tick(object sender, EventArgs e) 
{ 
    mins = int.Parse(Session["mins"].ToString()); 
    secs = int.Parse(Session["secs"].ToString()); 

    if (secs < 0) 
    { 
     secs = 59; 
     mins--; 
    } 

    if (secs < 10) 
     lbSecs.Text = "0" + secs; 
    else 
     lbSecs.Text = "" + secs; 

    if (mins < 10) 
     lbMins.Text = "0" + mins; 
    else 
     lbMins.Text = "" + mins; 

    if (secs == 0 && mins == 0) 
    { 
     lbMins.Text = "00"; 
     lbSecs.Text = "00"; 

     tmTimer.Enabled = false; 
    } 

    secs--; 

    upTiempo.Update(); 

    Session["mins"] = mins; 
    Session["secs"] = secs; 
}