Почему мое событие Button Click только запускает одно событие? - PullRequest
2 голосов
/ 18 ноября 2011

Я посмотрел в сети и не смог найти подходящего решения для этого.

Я создал простое веб-приложение .net, которое считывает данные из локальной базы данных 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);
            }
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

Проблема заключается в переменной позиции.Каждый раз, когда вы нажимаете кнопку, страница снова проходит весь жизненный цикл и повторно инициализирует позицию в 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;
    }
}
0 голосов
/ 18 ноября 2011

Важный факт, который вы должны понимать в веб-разработке, заключается в том, что все, что вы делаете в сети с точки зрения запроса / ответа, не имеет состояния - переменные не сохраняются в памяти между отдельными запросами (в отличие от настольных приложений). Вам всегда нужно использовать другой подход, например, элементы ввода ViewState, Cache, Session или HTML.

0 голосов
/ 18 ноября 2011

Вы хотите изучить, используя

if(!IsPostBack)

в загрузке вашей страницы ... каждый раз, когда нажимается кнопка, загрузка страницы запускается и сбрасывает ваш набор данных.

Кроме того, используйте статическую переменную для 'pos', она также, вероятно, сбрасывается каждый раз.

(Будьте осторожны со статическими переменными, если несколько пользователей используют эту страницу одновременно ... если это так, посмотрите на переменные сеанса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...