3

デフォルトのASP.NETWebアプリケーションテンプレートを試してみましたが、次のコードで例外がスローされます。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

作成したボタンをクリックしたとき。

誰かが技術的な説明を提供できますか?

注1:マークアップは、プレースホルダーが含まれる空白のページです。以下を参照してください。

注2:を置き換えるButtonLinkButton、コードは例外をスローせずに機能します。

public partial class test : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        foo();
    }
    protected override void OnLoad(EventArgs e)
    {
        foo();
    }
    protected void foo()
    {
        placeholder1.Controls.Clear();
        placeholder1.Controls.Add(new Button() { Text = "test", ID = "btn" });
    }
}

マークアップ:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication1.test" %>

<!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">
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder runat="server" ID="placeholder1" />
    </div>
    </form>
</body>
</html>
4

3 に答える 3

0

OnLoad() から foo() への呼び出しを削除すると、コードが機能し始めると思います。

この理由は、ページ ライフ サイクルのイベントの順序によるものです。コントロールがイベントを発生できるようにするには、ProcessPostData()、RaiseChangedEvents()、および RaisePostBackEvents() イベントが発生する前にコントロールを作成する必要があります ( http://www.eggheadcafe.com/articles/o_aspNet_Page_LifeCycle.jpgを参照)。これらのイベントは、OnInit() の後、OnLoad() の前に発生します。

OnLoad() で foo() を呼び出すことによってコードが現在立っているため、OnInit() で foo() が呼び出されたときに作成されたインスタンスを破棄するため、イベントが発生すると、それを発生させたコントロールは存在しなくなります。 「オブジェクト参照がインスタンスに設定されていません」というメッセージ。

于 2011-05-28T13:11:18.887 に答える
0

placeholder1 または placeholder1.Controls のいずれかが null のようです。これは、コード例が与えられた NullReferenceException の唯一の説明です。

于 2011-03-24T14:47:45.000 に答える
0

ボタンがポストバックから戻ってくると、ボタンは null になると思います。基本的にボタンを削除し、関連するイベントを削除する可能性が高い新しいボタンを作成しています。

私の理論をサポートするために、私はこれを試しました:

protected override void OnInit(EventArgs e)
{
    if (!IsPostBack)
        foo();
}
protected override void OnLoad(EventArgs e)
{
    if (!IsPostBack)
        foo();
}
protected void foo()
{
    placeholder1.Controls.Clear();
    placeholder1.Controls.Add(new Button() { Text = "test", ID = "btn" });
}

受け取ったエラーを受け取りませんでした。

あなたのように実行時にボタンを追加したいのはなぜですか?

于 2011-03-24T15:02:40.777 に答える