为什么我的按钮点击事件只触发一个

本文关键字:一个 按钮 我的 事件 为什么 | 更新日期: 2023-09-27 18:15:07

我在网上找了一下,没有找到相关的解决方案。

我已经创建了一个简单的。net web应用程序,从本地访问数据库读取数据。连接在读取第一行并填充文本框时工作。

当我单击按钮时,它读取并填充第二行,但随后它停止工作,不会读取下一行数据。我没有得到任何错误或构建问题。按钮停止工作了!是否有一些与事件处理程序,我错过了?

通过使用IsPostBack来查看页面之前是否加载,并使用ViewState来存储跨按钮单击/页面重新加载的位置值来解决。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication6._Default" %>
<!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:TextBox ID="TextBox1" runat="server" ontextchanged="TextBox1_TextChanged"></asp:TextBox>
        <br />
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" EnableClientScript="False"/>
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;
namespace WebApplication6
{
    public partial class _Default : System.Web.UI.Page
    {       
        private OleDbConnection connection;
        private OleDbCommand command;
        private OleDbDataAdapter adapter;
        private DataSet dataset;
        private string firstname;
        private string lastname;
        private int age;
        private int position;
        protected void Page_Load(object sender, EventArgs e)
        {
            connection = new OleDbConnection();
            command = new OleDbCommand();
            adapter = new OleDbDataAdapter();
            dataset = new DataSet();
            connection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:'People.mdb;Persist Security Info=False";
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Table1";
            adapter.SelectCommand = command;
            adapter.Fill(dataset, "Table1");
            ShowValuesOfRow(0);
        }
        private void ShowValuesOfRow(int pos)
        {
            DataRow row = dataset.Tables["Table1"].Rows[pos];
            position = pos;
            firstname = row["FirstName"].ToString();
            lastname = row["LastName"].ToString();
            age = (int)row["Age"];
            TextBox1.Text = firstname;
            TextBox2.Text = lastname;
            TextBox3.Text = age.ToString();
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            int lastIndex = dataset.Tables["Table1"].Rows.Count - 1;
            if (position < lastIndex)
            {
                position++;
                ShowValuesOfRow(position);
            }
        }
    }
}

为什么我的按钮点击事件只触发一个

问题在于位置变量。每次单击该按钮时,页面将再次经历整个生命周期,并将position重新初始化为0(这适用于所有变量)。解决这个问题的一种方法是使用viewstate来存储回发之间的位置。

MSDN: http://msdn.microsoft.com/en-us/library/system.web.ui.control.viewstate.aspx

的例子:

public int Position
{
    get
    {
        int? position = null;
        if (ViewState["Position"] != null)
        {
            position = ViewState["Position"] as int?;
        }
        return position ?? 0;
    }
    set
    {
        ViewState["Position"] = value;
    }
}

你想看看使用

if(!IsPostBack)

在你的页面加载…每次单击该按钮时,页面加载运行并重置数据集。

同样,为'pos'使用一个静态变量,它也可能每次都被重置。

如果多个用户同时使用此页面,请注意静态变量…如果是这种情况,请查看会话变量)

在web开发中,你需要了解的一个重要事实是,你在web上所做的任何关于请求/响应的事情都是无状态的——变量不会在单个请求之间持久化在内存中(与桌面表单应用程序相反)。您总是需要使用不同的方法,如ViewState, Cache, Session或HTML隐藏输入元素。