C#对象引用未设置为对象的实例-但仅当在循环中使用PictureBox数组时
如果我获取一些已经存在的图片库并将它们添加到数组中,VisualStudio对此没有问题。例如,我可以说,C#对象引用未设置为对象的实例-但仅当在循环中使用PictureBox数组时,c#,arrays,winforms,visual-studio,C#,Arrays,Winforms,Visual Studio,如果我获取一些已经存在的图片库并将它们添加到数组中,VisualStudio对此没有问题。例如,我可以说,trees[64],它会把图片盒放在前面,一切都很好 但是,当我使用循环将数组中的每个picturebox从头到尾都放到前面时,它会抛出一个错误。不管我从哪里开始或结束,不管我如何循环,仍然会给我一个例外 但是,如果我使用一个数字而不是int,即使它仍然在循环中,也没关系。我甚至可以告诉for循环以一个任意数字开始和结束,它会抛出异常,但如果我将完全相同的数字写入picturebox数组(t
trees[64]代码>,它会把图片盒放在前面,一切都很好
但是,当我使用循环将数组中的每个picturebox从头到尾都放到前面时,它会抛出一个错误。不管我从哪里开始或结束,不管我如何循环,仍然会给我一个例外
但是,如果我使用一个数字而不是int,即使它仍然在循环中,也没关系。我甚至可以告诉for循环以一个任意数字开始和结束,它会抛出异常,但如果我将完全相同的数字写入picturebox数组(trees[]
),它就可以正常工作
我想做的就是用一个循环把所有的图片框带到前面,这是不可能的吗
另外,如果您想知道为什么try/catch
语句看起来像这样,那是因为pictureboxes是以11x11的网格排列的
( TA0, TB0, TC0 ...
TA1, TB1, TC1 ...
TA2, TB2, TC2 ...
. . .
. . .
. . . )
(TA0、TB0、TC0。。。
TA1,TB1,TC1。。。
TA2,TB2,TC2。。。
. . .
. . .
. . . )
公共部分类表单1:表单
{
int[]单元格=新int[121];
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
生成();
}
私有void生成()
{
var-trees=new-PictureBox[121];
随机rnd=新随机();
int n;
对于(int i=0;i<10;i++)
{
尝试
{
trees[i]=(PictureBox)控件.Find(“TA”+(i).ToString(),true)[0];
树[i+11]=(PictureBox)控件。查找(“TB”+(i+1).ToString(),true)[0];
trees[i+22]=(PictureBox)控件.Find(“TC”+(i+1).ToString(),true)[0];
trees[i+33]=(PictureBox)控件.Find(“TD”+(i+1).ToString(),true)[0];
trees[i+44]=(PictureBox)控件.Find(“TE”+(i+1).ToString(),true)[0];
trees[i+55]=(PictureBox)控件.Find(“TF”+(i+1).ToString(),true)[0];
trees[i+66]=(PictureBox)控件。查找(“TG”+(i+1).ToString(),true)[0];
trees[i+77]=(PictureBox)控件.Find(“TH”+(i+1).ToString(),true)[0];
trees[i+88]=(PictureBox)控件。查找(“TI”+(i+1).ToString(),true)[0];
trees[i+99]=(PictureBox)控件.Find(“TJ”+(i+1).ToString(),true)[0];
trees[i+110]=(PictureBox)控件。查找(“TK”+(i+1).ToString(),true)[0];
}
捕获(IndexOutOfRangeException)
{
Show(“pictureBox不存在!”);
}
}
for(int idx=0;idx您只在数组中设置了110PictureBoxes
,但循环了121次。您的第一个for
循环需要再进行一次迭代-也就是说,退出条件应该是i<11
,而不是i<10
按原样,您的代码“跳过”数组位置10、21、32、43、54、65、76、87、98、109和120。如果您在第二个循环运行之前在代码中设置断点,并检查数组,您将在这些位置看到空值
一旦idx=10
,错误将正确地抛出到第二个循环中;该位置没有PictureBox
,因此NullReferenceException
将在数组中留下间隙
想想当i
为0
时会发生什么:将数组元素的PictureBox设置为索引0、11、22、33、44、55、66、77、88、99和110。然后当i
小于(但不等于)时循环运行10.您的最后一个值是9
,它将数组元素的PictureBox设置为9、20、31、42、53、64、75、86、97、108、119
这将在阵列中的位置10、21、32、43、54、65、76、87、98、109和120处留下间隙
你可以通过改变来解决这个问题,谢谢大家!是的,在这个问题上,我确实做得很努力。在我看来,我也是用一种最低效的方式来写代码的,我只是改变了数字系统,从左到右,从上到下,只需通过数字0到120,而不是字母/数字坐标系这使我能够用更少的代码对系统做更多的工作。(T0,T1,T2…T119,T120)下面是Generate()方法的一个示例,它给出了在新系统下所做更改的基本概念
请记住,我已经对代码进行了大量更新,因此这绝不能反映完全更新的系统。在这里,我创建动画的方法是将图片框层叠在一起,然后使用.BringToFront()命令;函数将每个PictureBox显示在视图中。目前,我使用121个PictureBox总计并更改每个PictureBox上的图像,而不是使用121个PictureBox的次数。这样,我就不会无缘无故地占用大量内存
var trees = new PictureBox[121];
Random rnd = new Random;
for(int idx = 0; idx <= 120; idx++)
{
try
{
trees[i] = (PictureBox)Controls.Find("T" + (i).ToString(), true)[0];
}
catch(IndexOutOfRangeException)
{
MessageBox.Show("pictureBox does not exist!");
}
Cell[idx] = rnd.Next(1,3)
if(Cell[idx] == 1)
{
trees[idx].BringToFront();
}
}
var-trees=newpicturebox[121];
随机rnd=新随机;
for(int idx=0;idx发生错误的行是什么?第一个循环必须是for(int i=0;i<11;i++)
。
var trees = new PictureBox[121];
Random rnd = new Random;
for(int idx = 0; idx <= 120; idx++)
{
try
{
trees[i] = (PictureBox)Controls.Find("T" + (i).ToString(), true)[0];
}
catch(IndexOutOfRangeException)
{
MessageBox.Show("pictureBox does not exist!");
}
Cell[idx] = rnd.Next(1,3)
if(Cell[idx] == 1)
{
trees[idx].BringToFront();
}
}