动态创建的控件导致Null引用

时间:2011-09-05 09:42:01

标签: c# asp.net dynamic-controls

我正在尝试动态创建控件并在运行时为它们提供属性。

我已将我的代码放在Page_Init事件中,当我运行我的网站时,我可以看到我的控件,但是当我点击提交按钮时,会出现错误,说“对象引用未设置为对象的实例”。

以下是我使用的代码:

    //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:对象引用未设置为对象的实例。]      _Default.Page_PreInit(Object sender,EventArgs e)位于c:\ Users \ bilalq \ Documents \ Visual Studio 2010 \ WebSites \ WebSite3 \ Default.aspx.cs:31      System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)+14      System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,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

5 个答案:

答案 0 :(得分:3)

由于FindControl不是递归的,您必须替换此代码:

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

通过此代码:

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

但是,根据其他答案,您应该在方法之外(在类级别)移动声明(而不是实例化),以便轻松获取控件的条目。

答案 1 :(得分:2)

尝试将代码放在Page_Load而不是Page_Init中,并在使用FindControl返回的对象之前检查null。

我怀疑对象InputTextBox为空,当您尝试打印Text时,它会崩溃。

作为一般规则,只需检查null以及将FindControl的结果转换为其他内容时的类型。

答案 2 :(得分:2)

FindControl失败,因为找不到控件并导致空引用。

只需使用FeedbackLabel直接引用它,就像您已经在课堂上使用它一样。只需将范围移到“初始化”方法之外。

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 =...;
}

答案 3 :(得分:1)

我建议您在page_int之外声明控件并在init中进行初始化,然后使用它们的名称而不是查找控件。

答案 4 :(得分:0)

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //-- Create your controls here
    }