Динамически созданные элементы управления, вызывающие нулевую ссылку - PullRequest
0 голосов
/ 05 сентября 2011

Я пытаюсь динамически создавать элементы управления и присваивать им свойства во время выполнения.

Я поместил свой код в событие 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 (Отправитель объекта, EventArgs e) в каталоге c: \ Users \ bilalq \ Documents \ Visual Studio 2010 \ WebSites \ WebSite3 \ Default.aspx.cs: 31 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 (логический includeStagesBeforeAsyncPoint, логический includeStagesAfterAsyncPoint) + 328

Ответы [ 5 ]

3 голосов
/ 05 сентября 2011

Поскольку FindControl не является рекурсивным, вы должны заменить этот код:

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

на этот код:

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

Однако, согласно другим ответам, вы должны переместить объявлениене экземпляр) вне метода (на уровне класса), чтобы легко получить запись для ваших элементов управления.

2 голосов
/ 05 сентября 2011

Ошибка FindControl, потому что он не может найти элемент управления и вызывает нулевую ссылку.

Просто обратитесь к нему напрямую, используя 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 =...;
}
2 голосов
/ 05 сентября 2011

попробуйте поместить свой код в Page_Load вместо Page_Init, а также проверьте нулевое значение перед использованием объектов, возвращаемых FindControl.

Я подозреваю, что объект InputTextBox является нулевым, и он падает, когда вы пытаетесь напечатать его Text.

как общее правило, просто проверяйте ноль, а также тип при приведении результатов FindControl к чему-либо еще.

1 голос
/ 05 сентября 2011

Я предлагаю вам объявить ваши элементы управления за пределами page_int и выполнить инициализацию в init, а затем использовать их со своим именем вместо find control.

0 голосов
/ 05 сентября 2011
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //-- Create your controls here
    }
...