Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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的边界_C# - Fatal编程技术网

C# 我无法创建PictureBox列表,索引超出数组C的边界

C# 我无法创建PictureBox列表,索引超出数组C的边界,c#,C#,我需要用C语言制作一些带有动画的游戏。所以我需要在按下按钮时创建新的PictureBox,我试着让它与列表一起工作,但我错过了一些东西。 索引超出数组的边界,我需要设置pictureBoxList的长度,这是错误告诉我的,但它不起作用 public partial class Form1 : Form { List<PictureBox> pictureBoxList = new List<PictureBox>(10); int ID = 0;

我需要用C语言制作一些带有动画的游戏。所以我需要在按下按钮时创建新的PictureBox,我试着让它与列表一起工作,但我错过了一些东西。 索引超出数组的边界,我需要设置pictureBoxList的长度,这是错误告诉我的,但它不起作用

public partial class Form1 : Form
{
    List<PictureBox> pictureBoxList = new List<PictureBox>(10);
    int ID = 0;

    private void buttonAddEnemy_Click(object sender, EventArgs e)
    {
          ID++;
          pictureBoxList.Add((PictureBox)Controls.Find("pictureBox" + ID, true)[0]);
          pictureBoxList[ID].Location = new System.Drawing.Point(1, 90);
          pictureBoxList[ID].Name = "pictureBoxEnemy";
          pictureBoxList[ID].Size = new System.Drawing.Size(25, 25);
          pictureBoxList[ID].BackgroundImage = Properties.Resources.Enemy;
          pictureBoxList[ID].BackgroundImageLayout = ImageLayout.Zoom;
          pictureBoxList[ID].BringToFront();
    }
}
试试这个

 List<PictureBox> pictureBoxList = new List<PictureBox>(10);
    int ID = 0;
    int position = 0;
    private void metroButton1_Click(object sender, EventArgs e)
    {
        ID++;
        pictureBoxList.Add((PictureBox)Controls.Find("pictureBox" + ID, true)[0]);
        pictureBoxList[position].Location = new System.Drawing.Point(1, 90);
        pictureBoxList[position].Name = "pictureBoxEnemy";
        pictureBoxList[position].Size = new System.Drawing.Size(25, 25);
        pictureBoxList[position].BackgroundImage = Properties.Resources.Enemy;
        pictureBoxList[position].BackgroundImageLayout = ImageLayout.Zoom;
        pictureBoxList[position].BringToFront();
        position++;



    }
第一个列表pictureBoxList=新列表10;这10是列表的最大长度,它没有填充图片框。因此,当你第一次单击按钮时,你的id是1,当你只有一个元素时,它明显地给出了一个例外。 应该是

pictureBoxList.Add((PictureBox)Controls.Find("pictureBox" + ID+1/* If your picture box is called pictureBOx1 and not pictureBox0 */, true)[0]);
pictureBoxList[ID].Location = new System.Drawing.Point(1, 90);
pictureBoxList[ID].Name = "pictureBoxEnemy";
pictureBoxList[ID].Size = new System.Drawing.Size(25, 25);
pictureBoxList[ID].BackgroundImage = Properties.Resources.Enemy;
pictureBoxList[ID].BackgroundImageLayout = ImageLayout.Zoom;
pictureBoxList[ID].BringToFront();
ID++;

当然,这是假设控件。Find返回一个有效值且不为null,但这样会出现对象引用异常。

向控件集合添加一个保护,以便在数组的元素不存在时不访问它们。这意味着在使用[0]访问控件之前,请检查控件.Find是否确实包含项。下面我举一个例子。希望对你有帮助

        private const int MAX_ENEMY = 9;
        private void buttonAddEnemy_Click(object sender, EventArgs e)
        {
            if (ID < MAX_ENEMY)
            {
                Control picBoxControl = Controls.Find("pictureBox" + ID, true)[0];
                if (picBoxControl is PictureBox)
                {
                    pictureBoxList.Add(picBoxControl as PictureBox);
                    //pictureBoxList[ID].Location = new System.Drawing.Point(1, 90);
                    pictureBoxList[ID].Name = "pictureBoxEnemy";
                    pictureBoxList[ID].Size = new System.Drawing.Size(25, 25);
                    pictureBoxList[ID].BackgroundImage = Properties.Resources.Enemy;
                    pictureBoxList[ID].BackgroundImageLayout = ImageLayout.Zoom;
                    pictureBoxList[ID].BringToFront();
                    ID++;
                }
            }
        }    

我没有看到任何创建PictureBox的代码。在ID++之后,您正在索引位置1处的元素,但那里没有元素。添加的第一个元素位于索引0。设置pictureBoxList[ID]属性后,执行ID++操作。您不能假设控件。Find将查找任何内容。盲目使用[0]进行索引将像这样发展。您需要通过实际创建控件新PictureBox并设置其Name属性来取得进展..是的,我进行了修改以便它可以找到它,但现在它给了我对象引用错误,我在找到它pictureBoxList[ID]之前设置了当前PictureBox的名称;我想我做得不对。。对象引用未设置为的实例object@Ricdan然后Controls.Find不返回正确的值它为null您可能在正确的容器中没有正确的图片框Controls可能甚至您根本没有它。也许您应该通过此Controls.OfType循环,看看是否有任何具有该名称的。您需要System.Linq那个。@Ricdan不,你们有pictureBoxList[ID]。Name=pictureBoxEnemy;在您找到picturebox后,所以这不是错误。在此控件中,id为pictureBox1,当我要添加到列表中时,我需要id为1,但位置上添加的第一个元素为0,所以为什么pictureBoxList[id]传递相同的id变量时,第一个元素添加时总是会出错。我给出了答案,但得到了否定的答案,但为什么我力不从心呢know@Dharmeshsharma是的,这可能是真的,我将编辑我的答案。但不需要第二个变量。代码工作正常,因为pictureBox1是控件id名称,所以我们不能将id用作添加的pictureBoxList的1,该列表在1位置没有元素。每次更新位置0处的所有属性。如果添加另一个控件,则必须执行ID++代码,以显示保护的使用情况,即检查控件的If条件。查找包含其集合中的项。这就是导致边界外感觉的原因。您可以根据需要进行编辑以添加其他控件。