【问题标题】:HTML Object reference not set to an instance of an objectHTML 对象引用未设置为对象的实例
【发布时间】:2011-11-27 21:20:43
【问题描述】:

我有一个简单的网页。其内容:

<%@ 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中使用了相同的语句,我无法理解错误的原因。

【问题讨论】:

  • @Henk 代码已发布到原始帖子。 TIA。
  • 您只是第一次加载数据。以下两个答案当场。

标签: c# .net html visual-studio-2008 nullreferenceexception


【解决方案1】:

根据您发布的代码,我们可以看到

 news_items = get_news_items ( );

仅在页面第一次加载时调用。

将此行添加到您的事件中,它将起作用。


我认为问题出在 news_items。请发布您声明的代码以及页面加载的完整代码。你在用if (!isPostBack)吗?

我相信您在if (!IsPostBack) 中加载 new_items 表。

【讨论】:

  • 就是这样。我还在 if ( !Page.IsPostBack ) 守卫中移动了 Current_News_Item 和 Number_News_Items 的初始化。
【解决方案2】:

也许填充您的news_items 集合的代码仅在初始Page_Load 调用(即Page.IsPostBack == false 时)执行?

【讨论】:

  • 没错。但是现在我正在查看它,也许 Current_News_Item、Number_News_Item 和事件处理程序声明都应该由 if (!Page.IsPostBack) 保护。
  • Button 的 Click 事件处理程序仅在有回发时调用,因此您不应该在那里添加 !Page.IsPostBack 保护。我宁愿建议在每个 Page_Load 上填写 news_items(如果获取这些新闻很耗时,可能来自一些缓存的来源)。
【解决方案3】:

检查 onLoad 中的 news_items.Rows[Current_News_Item + 1]["description"].ToString(); 是否会导致相同的异常 - 如果是,则除了默认项之外的其他项尚未初始化,或者它们的描述尚未初始化。

【讨论】:

  • 当页面加载时,会出现来自数据库的第一个新闻。当我点击下一个或上一个时,我遇到了困难。 TIA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多