Проблема с label1.Text в UserControl1.cs

Рейтинг: 0Ответов: 1Опубликовано: 21.06.2011

Я создал UserControl1.cs. В этот компонент передается два значения, которые суммируются и выводятся в lable1 этого компонента. Но когда доходит в методе Am() до

  label1.Text = c.ToString();

то появляется ошибка: Ссылка на объект не указывает на экземпляр объекта. NullReferenceException не обработано.

Код формы:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bred4
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        UserControl1 fff = new UserControl1(6,3);
        fff.Am();
    }
    private void userControl11_Load(object sender, EventArgs e)
    {
    }
}
}

Код UserControl:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bred4
{
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
    public UserControl1(float aa, float bb)
    {
        a = aa;
        b = bb;
    }
    static float a, b; 
    float c;
    private void UserControl1_Load(object sender, EventArgs e)
    {
    }
    private void button1_Click(object sender, EventArgs e)
    {
       c = a + b;
       label1.Text = c.ToString();
    }
    public void Am()
  {
         c = a + b;
         label1.Text = c.ToString(); //ошибка в этом месте
  }
}
}

Если использовать метод button1_Click() , т.е. нажать на кнопку, то сложение происходит и ошибки не возникает. В чем причина и как решить проблему?

Ответы

▲ 2Принят

Судя по исключению, в момент выполнения метода label1 == null.

Просто в другом конструкторе UserControl1 отсутствует вызов метода InitializeComponent(), который и занимается созданием элементов управления на контроле, в т.ч. label1.

Но даже после исправления кода суммирование отображаться не станет, т.к. будет происходить создание UserControl1, выполнение Am() и сборка мусорщиком, без всякого отображения на форме. Тут скорее стоит просто выполнить метод Am() у уже созданного контрола на форме (в данном случае, в Form_Load()):

userControl11.A = 6;
userControl11.B = 3;
userControl11.Am();

Для этого предварительно необходимо добавить свойства A и B в UserControl1:

public float A
{
    get { return a; }
    set { a = value; }
}

// B аналогично