2014-10-01 6 views
0

Я очень новичок в ASP.NET, но у меня есть фон в C и C#. Я пытаюсь сделать веб-приложение, которое будет связано с моей базой данных. Я сделал это, и все в порядке. Проблема возникла, когда я добавил кнопки для перемещения вперед и назад через базу данных ... Он работал нормально, но только одним щелчком! Тогда я подумал, что, вероятно, у меня есть ошибка в коде, и я решил сделать это легко.asp.net кнопка click событие происходит только один раз

Я создал новую веб-форму с помощью одной кнопки и одной метки, но поведение по-прежнему остается прежним - после того, как событие первого щелчка не будет запущено снова. Любая помощь?

Мой код

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DummyTest 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
    int pom = 0; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Label1.Text = Convert.ToString(pom); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     pom++; 
     Label1.Text = Convert.ToString(pom); 
    } 
    } 
    } 

и источник

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" 
Inherits="DummyTest.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 

    Dummy Test 
    <br /> 
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> 
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
    <br /> 

</div> 
</form> 
</body> 

ответ

0

Он работает сейчас! Вот код для Up и Down.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace DummyTest 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     static int pom; 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (Page.IsPostBack == false) 
      { 
       pom = 0; 
       Label1.Text = Convert.ToString(pom); 
      } 
     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      var pom = Int32.Parse(Label1.Text); 
      pom++; 
      Label1.Text = Convert.ToString(pom); 
     } 

     protected void Button2_Click(object sender, EventArgs e) 
     { 
      var pom = Int32.Parse(Label1.Text); 
      pom--; 
      Label1.Text = Convert.ToString(pom); 
     } 
    } 
} 
2

Ваш класс Webform пересоздался на каждый запрос - это просто, как это работает. Вам нужно удержать полевой пот каким-то другим способом. Вы можете добавить его в состояние сеанса, но это влияет на масштабируемость приложения, так как тогда вы сохраняете состояние на сервере.

Это уже сохранялось управлением этикетки, так что вы могли бы сделать что-то подобное в вашем случае клик:

var pom = Int.Parse(Label1.Text); 
pom++; 
Label1.Text = pom.ToString(); 

Однако, это не всегда будет место для чего-то вы хотите, чтобы сохраняться. В этих случаях я бы добавил скрытое поле в html, который его удерживает. Мои WebForms немного ржавый, но в разметке:

<asp:HiddenField id="pom" value="0" /> 

затем вытащить значение из и приращения в случае щелчка, как я сделал выше.

+0

Большое спасибо за ваш ответ. Пожалуйста, можете ли вы более конкретно указать «добавить скрытое поле в html, который его удерживает»? – kimi87

+0

@ kimi87 Я обновил ответ – Fordio

1

Всякий раз, когда вы нажимаете на ваш int pom = 0, инициализируйте ноль, а затем вы установите значение, поэтому оно выглядит как вызов. либо сделать его статическим или лучше попробовать:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Label1.Text = "" + (Convert.ToInt32(Label1.Text) + 1); 
} 
0

Вы можете попробовать переместив инициализацию в IsPostBack проверки, поэтому перезагрузки страницы повторно не intitialise переменную в 0. Значение IsPostBack указывает, является ли страница быть визуализируется в первый раз или загружается в ответ на обратную передачу, и событие нажатия кнопки вызывает обратную передачу.

Дополнительные
В IsPostBack пожаров на определенной стадии в page lifecycle

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     int pom = 0; 
    } 
    Label1.Text = Convert.ToString(pom); 
} 

В какой-то степени это зависит от того, что цель переменной pom есть. Если он отслеживает клики для каждого пользователя, то это должно помочь. Однако, если вы отслеживаете клики по всем пользователям, тогда вы должны рассмотреть что-то еще (возможно, используя global.asax)

+0

Я изменил на 'if (Страница.IsPostBack == false) { pom = 0; } else { Label1.Text = Convert.ToString (pom); pom ++; } '} и теперь он работает, но я не уверен, как реализовать декремент ... – kimi87

+0

Выполнение форм ASP.NET может быть немного странным, но загляните в ссылки для жизненного цикла IsPostBack и страниц, они должны помочь вам следить за тем, что происходит, и когда они это делают –

Смежные вопросы