我在网上四处寻找并且无法找到相关解决方案。
我创建了一个简单的.net Web应用程序,它从本地Access数据库中读取数据。连接在读取第一行并填充文本框时起作用。
当我单击按钮时,它会读取并填充第二行,但它会停止工作,并且不会读取下一行数据。我没有收到任何错误或构建问题。按钮停止工作!我缺少哪些事件处理程序?
通过使用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);
}
}
}
}
答案 0 :(得分:4)
问题是位置变量。每次单击该按钮时,页面都会再次遍历整个生命周期,并将位置重新初始化为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;
}
}
答案 1 :(得分:0)
您想要使用
if(!IsPostBack)
在页面加载中每次单击按钮时,页面加载都会运行并重置数据集。
另外,对'pos'使用静态变量,它也可能每次都重置。
(如果多个用户同时使用此页面,请注意静态变量......如果是这种情况,请查看会话变量)
答案 2 :(得分:0)
您需要在Web开发中理解的重要事实是,您在Web上根据请求/响应执行的所有操作都是无状态的 - 变量不会在各个请求之间保留在内存中(与桌面形式的应用程序相对)。您总是需要使用不同的方法,如ViewState,Cache,Session或HTML hiddent输入元素。