2014-10-01 137 views
0

我对ASP.NET很新,但我有C和C#的背景。我正在尝试制作将与我的数据库连接的Web应用程序。我做到了,那没问题。当我添加按钮来向前和向后通过数据库时发生问题...它工作正常,但只有一次点击!然后,我认为可能我在代码中存在错误,并且我决定以简单的方式执行此操作。asp.net按钮点击事件只发生一次

我创建了一个只有一个按钮和一个标签的新Web表单,但行为仍然相同 - 在第一次点击事件后不再被触发。任何帮助?

我的代码

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

它现在正在工作!这里是上下的代码。

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" /> 

然后拉出保值增值click事件,因为我之前所做的那样。

+0

非常感谢您的回答。请,你可以更具体的“添加一个隐藏的领域的HTML持有它”? – kimi87 2014-10-01 08:01:39

+0

@ kimi87我已更新答案 – Fordio 2014-10-01 08:09:12

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 if(Page。IsPostBack == false) { pom = 0; } else { Label1.Text = Convert.ToString(pom); pom ++; } 现在它正在工作,但我不知道如何实现递减... – kimi87 2014-10-01 08:12:19

+0

ASP.NET窗体的执行可能有点奇怪,但查看IsPostBack和页面生命周期的链接,它们应该帮助您了解正在发生的事件以及事件发生的时间 – 2014-10-01 08:23:23