3

ASP を初めて使用するので、非常に基本的な質問のように感じます。default.aspx.cs ファイルに次のコードがあります。

        protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Get one day ago
            DateTime oneDayAgo = DateTime.Now.ToLocalTime().AddDays(-1);
            String strOneDayAgo = oneDayAgo.ToString();

            //Declare the query string
            String queryString = "Select * from Computers Where whenCreated >= '" + strOneDayAgo + "' ORDER BY whenCreated DESC";

            //Show the query being used to the user
            lblQueryUsed.Text = queryString;

            // Run the query and bind the resulting DataSet to the GridView control.
            DataSet ds = GetData(queryString);
            if (ds.Tables.Count > 0)
            {
                GridView1.DataSource = ds;
                GridView1.DataBind();
            }
        }
    }

すべてうまく機能しますが、問題は、ユーザーがそのページのリンクをクリックして Reports.aspx という別のページに移動すると、同じ Page_Load イベントが発生し、すべてのコントロール (lblQueryUsed、GridView1) が NULL に設定されることです。何らかの理由で、例外が発生します。

Reports.aspx を読み込もうとすると、default.aspx の Page_Load イベントが読み込まれるのはなぜですか? コントロールが null なのはなぜですか?

助けてくれてありがとう。

編集:これがそのページの完全なコードです。他に何が必要ですか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.DirectoryServices;
using System.Data.SqlClient;
using Sorter;
using System.Data;

namespace AD_watcher_web_app
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Get one day ago
            DateTime oneDayAgo = DateTime.Now.ToLocalTime().AddDays(-1);
            String strOneDayAgo = oneDayAgo.ToString();

            //Declare the query string
            String queryString = "Select * from Computers Where whenCreated >= '" + strOneDayAgo + "' ORDER BY whenCreated DESC";

            //Show the query being used to the user
            lblQueryUsed.Text = queryString;

            // Run the query and bind the resulting DataSet to the GridView control.
            DataSet ds = GetData(queryString);
            if (ds.Tables.Count > 0)
            {
                GridView1.DataSource = ds;
                GridView1.DataBind();
            }
        }
    }

    protected void Label1_PreRender(object sender, EventArgs e)
    {
        //Populate the labels
        lblCompCount.Text = GridView1.Rows.Count.ToString();
        lblTimeRun.Text = DateTime.Now.ToLocalTime().ToString();
    }

    ///////////////////////METHODS///////////////////////

    DataSet GetData(String queryString)
    {
        // Set the connection string
        SqlConnectionStringBuilder conBuilder = new SqlConnectionStringBuilder();
        conBuilder.DataSource = "dbsql01dev.llnl.gov";
        conBuilder.InitialCatalog = "XloadDB";
        conBuilder.IntegratedSecurity = true;

        String connectionString = conBuilder.ConnectionString;

        //Declare a new dataset
        DataSet ds = new DataSet();

        try
        {
          // Connect to the database and run the query.
          SqlConnection connection = new SqlConnection(connectionString);        
          SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

          // Fill the DataSet.
          adapter.Fill(ds);
        }
        catch(Exception ex)
        {
          // The connection failed. Display an error message.
            lblExceptions.Text = ex.ToString();
            lblExceptions.Visible = true;
        }
        return ds;
      }
}
}
4

1 に答える 1

8

サーバー側コントロールが機能するには、コントロール イベントが発生する前にページをリロードする必要があります。

これはページのライフサイクルの一部です。

この動作はサーバー側のリンクでも発生します。ポストバックが発生すると、ページがリロードされて起動しpage_loadます。

これを回避するには、リンクを純粋なクライアント側のリンクにします。

いいえrunat="server"、適切な HTML<a href="">link</a>リンクです。

于 2012-05-03T19:18:30.520 に答える