0

コントロールを動的に作成し、実行時にプロパティを指定しようとしています。

コードを Page_Init イベント内に配置しました。Web サイトを実行するとコントロールが表示されますが、送信ボタンをクリックすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

これが私が使用したコードです:

    //Creates instances of the Control    
    Label FeedbackLabel = new Label();
    TextBox InputTextBox = new TextBox();
    Button SubmitButton = new Button();
    // Assign the control properties

    FeedbackLabel.ID = "FeedbackLabel";
    FeedbackLabel.Text = "Please type your name: ";
    SubmitButton.ID = "SubmitButton";
    SubmitButton.Text = "Submit";
    InputTextBox.ID = "InputTextBox";
    // Create event handlers
    SubmitButton.Click += new System.EventHandler(SubmitButton_Click);

    // Add the controls to a Panel
    Panel1.Controls.Add(FeedbackLabel);
    Panel1.Controls.Add(InputTextBox);
    Panel1.Controls.Add(SubmitButton);
}

protected void SubmitButton_Click(object sender, EventArgs e)
{
    // Create an instance of Button for the existing control
    Button SubmitButton = (Button)sender;
    // Update the text on the Button
    SubmitButton.Text = "Submit again!";

    // Create the Label and TextBox controls
    Label FeedbackLabel = (Label)FindControl("FeedbackLabel");
    TextBox InputTextBox = (TextBox)FindControl("InputTextBox");
    // Update the controls
    FeedbackLabel.Text = string.Format("Hi, {0}", InputTextBox.Text);

このエラーを修正するにはどうすればよいですか?

これはスタック トレースです

[NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。] c:\Users\bilalq\Documents\Visual Studio 2010\WebSites\WebSite3\Default.aspx.cs:31 の _Default.Page_PreInit(オブジェクト送信者、EventArgs e) System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp、オブジェクト o、オブジェクト t、EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(オブジェクト送信者、EventArgs e) +35 System.Web.UI.Page。 OnPreInit(EventArgs e) +8876158 System.Web.UI.Page.PerformPreInit() +31 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +328

4

5 に答える 5

3

FindControl は再帰的ではないため、次のコードを置き換える必要があります。

Label FeedbackLabel = (Label)FindControl("FeedbackLabel");
TextBox InputTextBox = (TextBox)FindControl("InputTextBox");

このコードで:

Label FeedbackLabel = (Label)Panel1.FindControl("FeedbackLabel");
TextBox InputTextBox = (TextBox)Panel1.FindControl("InputTextBox");

ただし、他の回答によると、コントロールのエントリを簡単に取得するには、(インスタンス化ではなく) 宣言をメソッドの外 (クラス レベル) に移動する必要があります。

于 2011-09-05T09:49:29.227 に答える
2

コードを Page_Init の代わりに Page_Load に入れてみてください。また、FindControl によって返されたオブジェクトを使用する前に null をチェックしてください。

オブジェクトInputTextBoxが null であると思われ、印刷しようとするとクラッシュしますText

原則として、FindControl の結果を別のものにキャストするときに、null と型をチェックするだけです。

于 2011-09-05T09:46:27.903 に答える
2

FindControlコントロールが見つからず、null 参照が発生するため、失敗しています。

クラスにすでにあるので、直接参照してFeedbackLabelください。スコープを「Init」メソッドの外に移動するだけです。

private Label feedbackLabel = new Label();
private TextBox inputTextBox = new TextBox();
private Button submitButton = new Button();

public void Page_Init(EventArgs e)
{
    feedbackLabel.ID = "FeedbackLabel";
}

protected void SubmitButton_Click(object sender, EventArgs e)
{
    feedbackLabel.Text =...;
}
于 2011-09-05T09:47:27.927 に答える
1

page_int の外でコントロールを宣言し、init で初期化を行ってから、find コントロールの代わりにそれらの名前を使用することをお勧めします。

于 2011-09-05T09:49:01.630 に答える
0
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //-- Create your controls here
    }
于 2011-09-05T09:52:11.823 に答える