我正在尝试动态创建控件并在运行时为它们提供属性。
我已将我的代码放在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
答案 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
}