【问题标题】:For Loop through PictureBoxes WITHOUT an array on c#For循环通过PictureBoxes而没有c#上的数组
【发布时间】:2020-02-29 06:53:13
【问题描述】:
char SideA = 'A';
char SideB = 'B';
int CPUPlayer = 1;
Test.Text = x.ToString();

if (difficulty == 1)
{ 
    if (CPUPlayer == 1)
    {

        string targetString = "";
        for (int side = 1; side <= 1; side++)
        {

            targetString = SideA.ToString();
            Test.Text = targetString.ToString();
            for (int game = 1; game < 25; game++)
            {
                targetString = game.ToString();
                for (int tile = 1; tile < 10; tile++)
                {
                    targetString = tile.ToString();
                    PictureBox target = (PictureBox)(this.Controls.Find(targetString, true))[0];
                    if (target.BackgroundImage == null)
                    {
                        target.BackgroundImage = Properties.Resources.smallo;
                        Test.Text = targetString.ToString();
                    }
                }
            }

        }
    }
}

所以我试图循环通过预先命名的图片框(例如:A11、A12、A13....等),让它们通过使用循环字符串连接到图片框来更改背景图像,但我不断收到@987654323 @来自PictureBox target = (PictureBox)(this.Controls.Find(targetString, true))[0];

我不知道该怎么做才能修复它。我对 c# 和一般编码非常陌生,所以很高兴知道我缺少什么!

【问题讨论】:

  • 显然this.Controls.Find(targetString, true) 在某些情况下是一个空数组。
  • 你需要将PictureBox target = (PictureBox)(this.Controls.Find(targetString, true))[0]分解成多个语句和look at the values in a debugger
  • 将图像缓存在数组中,而不是像那样使用来自Resources 的图像。当一个对象会做并且会导致泄漏时,您会不必要地创建大量对象

标签: c# for-loop indexoutofboundsexception picturebox


【解决方案1】:

帮助你找到问题改

PictureBox target = (PictureBox)(this.Controls.Find(targetString, true))[0];

var found = this.Controls.Find(targetString, true);

if(found == null || found.Length < 1 ) {
  throw new Exception("Picture not found")
}

之后,在throw这一行设置断点,找出图片找不到的原因。

【讨论】:

  • 对不起那个字符串,我把它编辑掉了,它只是在测试中我忘了拿出来,然后我把它贴出来了:(
  • 您的评论让我意识到出了什么问题,非常感谢!
【解决方案2】:

结果证明只是我的.ToString(); 逻辑完全错误,字符串作为一个不存在的图片框出现。这是有效的代码:

            if (difficulty == 1)
        { 
            if (CPUPlayer == 1)
            {

                string targetString = "";
                for (int side = 1; side <= 1; side++)
                { 
                    for (int game = 1; game < 25; game++)
                    {

                        for (int tile = 1; tile < 10; tile++)
                        {
                            targetString = SideA;
                            targetString += game.ToString();
                            targetString += tile.ToString();
                            Test.Text = targetString.ToString();
                            PictureBox target = (PictureBox)(this.Controls.Find(targetString, true))[0];

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2012-06-04
    • 1970-01-01
    • 2013-06-13
    • 2016-10-12
    • 2014-04-27
    • 2018-12-19
    • 2014-06-11
    • 2020-05-25
    相关资源
    最近更新 更多