Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象引用未设置为对象的实例-但仅当在循环中使用PictureBox数组时_C#_Arrays_Winforms_Visual Studio - Fatal编程技术网

C#对象引用未设置为对象的实例-但仅当在循环中使用PictureBox数组时

C#对象引用未设置为对象的实例-但仅当在循环中使用PictureBox数组时,c#,arrays,winforms,visual-studio,C#,Arrays,Winforms,Visual Studio,如果我获取一些已经存在的图片库并将它们添加到数组中,VisualStudio对此没有问题。例如,我可以说,trees[64],它会把图片盒放在前面,一切都很好 但是,当我使用循环将数组中的每个picturebox从头到尾都放到前面时,它会抛出一个错误。不管我从哪里开始或结束,不管我如何循环,仍然会给我一个例外 但是,如果我使用一个数字而不是int,即使它仍然在循环中,也没关系。我甚至可以告诉for循环以一个任意数字开始和结束,它会抛出异常,但如果我将完全相同的数字写入picturebox数组(t

如果我获取一些已经存在的图片库并将它们添加到数组中,VisualStudio对此没有问题。例如,我可以说,
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您只在数组中设置了110
PictureBoxes
,但循环了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();
    }
    }