Ссылка на объект HTML не установлена ​​для экземпляра объекта - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть простая веб-страница.Его содержание:

<%@ Page Language="C#" 
         AutoEventWireup="true" 
         CodeFile="default.aspx.cs" 
         Inherits="_Default" %>

<!DOCTYPE HTML PUBLIC 
          "-//W3C//DTD HTML 4.01//EN" 
          "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-type" 
        content="text/html; charset=utf-8" />
  <title>Test Page</title>
</head>
<body>
  <form id="form1" 
        runat="server">
    <div id="header" >
      <asp:Button
           ID="previous_BUT"
           runat="server"
           Height="25px"
           Text="Previous" 
           Visible="false"
           Width="100px" />
      <asp:Label
           ID="txtNewsItem"
           runat="server"
           Height="20px"  
           Visible="false"
           Width="550px" />
      <asp:Button
           ID="next_BUT"
           runat="server"
           Height="25px"
           Text="Next" 
           Visible="false"
           Width="100px" />
    </div>

  </form>
</body>
</html>

Код страницы (за исключением переменной Session и извлечения значений Web.config):

using ...

// **************************************************** class _Default

public partial class _Default : Page
    {

    DataTable   news_items = null;

    // ********************************************* Connection_String

    /// <summary>
    /// get the value of the database connection string from 
    /// the Web.Config file ConnectionString element
    /// </summary>
    public string Connection_String ...

    // ********************************************* Current_News_Item

    /// <summary>
    /// set or get the value of the Current_News_Item Session
    /// variable
    /// </summary>
    private int Current_News_Item ...

    // ********************************************* Number_News_Items

    /// <summary>
    /// set or get the value of the Number_News_Items Session 
    /// variable
    /// </summary>
    private int Number_News_Items ...

    // ************************************************ get_news_items

    /// <summary>
    /// retrieve the news items from the database
    /// </summary>
    /// <returns></returns>
    private DataTable get_news_items ( )
        {
        DataTable       data_table = null;
        SqlConnection   SQL_connection = null;

        try
            {
            DataSet         data_set = new DataSet ( );
            DateTime        now = DateTime.Now;
            StringBuilder   select_statement;
            SqlDataAdapter  SQL_data_adapter;
            DateTime        today;

            today = new DateTime ( now.Year, now.Month, now.Day );

            select_statement = new StringBuilder ( ).AppendFormat (
                "SELECT hpn.description " +
                "FROM tbl_homePageNews hpn " +
                "WHERE effectiveDate <= GETDATE() and status = 1 " +
                "ORDER BY sortOrder ASC",
                today.ToShortDateString ( ) );

            SQL_connection = new SqlConnection ( Connection_String );
            SQL_connection.Open ( );

            SQL_data_adapter = new SqlDataAdapter ( 
                                       select_statement.ToString ( ),
                                       SQL_connection );
            SQL_data_adapter.Fill ( data_set, "tbl_homePageNews" );

            data_table = data_set.Tables [ "tbl_homePageNews" ].
                                  Copy ( );
            }
        catch
            {
            data_table = null;
            }
        finally
            {
            if ( SQL_connection != null )
                {
                SQL_connection.Close ( );
                }
            }

        return ( data_table );
        }

    // ***************************************************** Page_Load

    protected void Page_Load ( object sender, EventArgs e )
        {

        next_BUT.Click += new EventHandler( next_BUT_Click );
        previous_BUT.Click += new EventHandler( previous_BUT_Click );

        Current_News_Item = 0;
        Number_News_Items = 0;

        if ( !Page.IsPostBack )
            {
            news_items = get_news_items ( );

            if ( news_items != null )
                {
                Number_News_Items = news_items.Rows.Count;

                previous_BUT.Visible = false;
                txtNewsItem.Visible = false;
                next_BUT.Visible = false;

                if ( Number_News_Items > 0 )
                    {
                    txtNewsItem.Visible = true;
                    txtNewsItem.Text = 
                        "  " + 
                        news_items.Rows [ Current_News_Item ] 
                                        [ "description" ].
                                   ToString ( );

                    if ( Number_News_Items > 1 )
                        {
                        previous_BUT.Visible = true;
                        next_BUT.Visible = true;
                        }
                    }
                }
            }
        }

    // ******************************************** previous_BUT_Click

    /// <summary>
    /// handle the Previous button click
    /// </summary>
    public void previous_BUT_Click ( Object sender,
                                     EventArgs e )
        {

        Current_News_Item--;
        if ( Current_News_Item < 0 )
            {
            Current_News_Item = Number_News_Items - 1;
            }

        txtNewsItem.Text =  
            "  " + news_items.Rows [ Current_News_Item ] 
                                   [ "description" ].ToString ( );
        }

    // ************************************************ next_BUT_Click

    /// <summary>
    /// handle the Next button click
    /// </summary>
    public void next_BUT_Click ( Object    sender,
                                 EventArgs e )
        {

        Current_News_Item++;
        if ( Current_News_Item >= Number_News_Items )
            {
            Current_News_Item = 0;
            }

        txtNewsItem.Text = 
            "  " + news_items.Rows [ Current_News_Item ] 
                                   [ "description" ].ToString ( );
        }

    } // class _Default

В коде, лежащем в Page_Load, есть операторы

                    txtNewsItem.Visible = true;
                    txtNewsItem.Text = 
                        "  " + 
                        news_items.Rows [ Current_News_Item ] 
                                        [ "description" ].
                                   ToString ( );

Оба выполняются как положено - отображается первый элемент новостей.Пользователь может нажать кнопку «Предыдущий» или «Далее», чтобы перемещаться между новостями.Но тут возникает проблема.В следующем коде дела обстоят плохо

    // ************************************************ next_BUT_Click

    /// <summary>
    /// handle the Next button click
    /// </summary>
    public void next_BUT_Click ( Object    sender,
                                 EventArgs e )
        {

        Current_News_Item++;
        if ( Current_News_Item >= Number_News_Items )
            {
            Current_News_Item = 0;
            }

        txtNewsItem.Text = 
            "  " + news_items.Rows [ Current_News_Item ] 
                                   [ "description" ].ToString ( );
        }

Оператор

        txtNewsItem.Text = 
            "  " + news_items.Rows [ Current_News_Item ] 
                                   [ "description" ].ToString ( );

вызывает ошибку с txtNewsItem красным цветом.Та же ошибка возникает в previous_BUT_Click.

Поскольку в Page_Load используется тот же оператор, я не могу понять причину ошибки.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Может быть, код, который заполняет вашу коллекцию news_items, выполняется только при первоначальном Page_Load вызове (то есть, когда Page.IsPostBack == false)?

2 голосов
/ 28 ноября 2011

На основании кода, который вы разместили, мы можем видеть, что

 news_items = get_news_items ( );

Вызывается только при первой загрузке страницы.

Добавьте эту строку в ваши события, и она будет работать.


Я считаю, что проблема с news_items. Пожалуйста, опубликуйте код, где вы это объявите, и полный код загрузки страницы. Вы используете if (!isPostBack)?

Я верю, что вы и в if (!IsPostBack) вы загружаете таблицу new_items.

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

Проверьте, не вызовет ли news_items.Rows[Current_News_Item + 1]["description"].ToString(); в onLoad то же исключение - если да, то другие элементы, кроме элемента по умолчанию, не были инициализированы или их описания не были инициализированы.

...