"对象引用未设置为对象的实例"当试图改变图片框图像

时间:2014-07-06 18:57:45

标签: c# nullreferenceexception

我正在尝试根据列表的出现次数更改pictureBox的图像:

list<string> items = new List<string>();
items.Add("Item1");
items.Add("Item2");
items.Add("Item3");
items.Add("Item4");
items.Add("Item5");

foreach (var item in items.OfType<string>().Select((x, i) => new { x, i }))
{
 int ItemNumber = item.i + 1;
 string ItemNumberStr = ItemNumber.ToString();
 PictureBox pbox = (PictureBox)this.Controls["Picturebox" + ItemNumberStr];
 pbox.Image = Properties.Resources.white_square_button;
 Label labl = (Label)this.Controls["label" + ItemNumberStr];
 labl.Text = item.x;
}

这是在foreach事件中完成的,其中item.i是表示为int的出现次数,然后转换为string以确定pictureBox的数量{1}}我正在尝试修改。但是当我这样做时,我在这里收到错误“对象引用没有设置为对象的实例”:

pbox.Image = Properties.Resources.white_square_button;

label也会发生这种情况。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

如果没有具有此类名称的控件,

ControlCollection[String]将不会抛出异常:

        Control control = this.Controls["I am not here"];
        MessageBox.Show((control == null).ToString());

Properties.Resources属性为空是值得怀疑的,因此最可能的是您尝试访问的控件不存在或命名有点不同。

答案 1 :(得分:0)

我尝试修改的PictureBoxes位于panel,如此处所述:this.Controls doesn't contain all controls通过执行this.Controls["Picturebox" + ItemNumberStr]它会返回一个空引用,因为PictureBoxes 1}}被分配给该标签。所以我所做的就是将this替换为panel1PictureBoxes所在的面板的名称),现在它就像魅力一样。

list<string> items = new List<string>();
items.Add("Item1");
items.Add("Item2");
items.Add("Item3");
items.Add("Item4");
items.Add("Item5");

foreach (var item in items.OfType<string>().Select((x, i) => new { x, i }))
{
 int ItemNumber = item.i + 1;
 string ItemNumberStr = ItemNumber.ToString();
 PictureBox pbox = (PictureBox)panel1.Controls["Picturebox" + ItemNumberStr];
 pbox.Image = Properties.Resources.white_square_button;
 Label labl = (Label)panel1.Controls["label" + ItemNumberStr];
 labl.Text = item.x;
}