0

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

我已将代码放在 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:对象引用未设置为对象的实例。] c:\Users\bilalq\Documents\Visual Studio 2010\WebSites\WebSite3\Default.aspx.cs:31 中的 _Default.Page_PreInit(Object sender, EventArgs e) 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(布尔 includeStagesBeforeAsyncPoint,布尔 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_Load 而不是 Page_Init 中,并且在使用 FindControl 返回的对象之前检查 null。

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

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

于 2011-09-05T09:46:27.903 回答
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 =...;
}
于 2011-09-05T09:47:27.927 回答
1

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

于 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 回答