NullReferenceException не было обработано в C # - PullRequest
0 голосов
/ 05 декабря 2010

Я взял эту ошибку в строке, которую я прокомментировал, в чем проблема?

private void pictureBox34_Click(object sender, EventArgs e)
{
    if (pictureBox34.Image == chess9.Properties.Resources.siyahsah2)
    {
        f();
    }
}

public void picarray()
{
    pic[0, 0] = pictureBox54;
    pic[0, 1] = pictureBox64;
    pic[0, 2] = pictureBox48;
    pic[0, 3] = pictureBox42;
    pic[0, 4] = pictureBox34;
    pic[0, 5] = pictureBox26;
    pic[0, 6] = pictureBox18;
    pic[0, 7] = pictureBox8;
    pic[1, 0] = pictureBox1;
    pic[1, 1] = pictureBox2;
    pic[1, 2] = pictureBox3;
    pic[1, 3] = pictureBox4;
    ...
}

public void f()
{
    // int i = 0, j = 0;
    int x = 3;
    int y = 3;

    for (int i = 1; i < x; i++)
    {
        for (int j = 1; j < y; j++)
        {
            pic[i, j] = new PictureBox();
            // pic[i, j] = pic[i + 1, j + 1];
            pic[i, j].Image = chess9.Properties.Resources.siyahsah2;
        }
    }
}

Ответы [ 3 ]

6 голосов
/ 05 декабря 2010

Мне довелось прочитать ваш предыдущий вопрос, поэтому, если я правильно понимаю, это реализация шахматной игры.

Вместо того, чтобы пытаться исправить исключение в этом коде, я бы посоветовал вам внести некоторые изменения в свой дизайн.

Основное изменение: отделите отображение статуса вашей игровой доски от уровня пользовательского интерфейса. Если я правильно понимаю, вы используете массив объектов PictureBox для представления фигур на доске. Возможно, было бы лучше, если бы вы написали классы, представляющие плату, фигуры и все их действия, а затем написали отдельный код, который может отображать эти классы в окне, и принимали команды от пользователя через пользовательский интерфейс.

Когда вы реализуете движения элементов и обновления доски посредством манипулирования объектами пользовательского интерфейса, вы обязаны совершать больше ошибок и тратить гораздо больше времени на отладку.

Надеюсь, это поможет ...

4 голосов
/ 05 декабря 2010
  • Убедитесь, что указанный файл действительно существует. Кроме того, желательно изменить / на \\ (или \ в строке @"...") в пути к файлу, если вы работаете в системе Windows. (Хотя это не должно быть причиной вашей проблемы.)

    ... = Image.FromFile( @"pic\siyahsah2.jpg" ); 1010 *
    *

  • Убедитесь, что индексы i и j верны. Ваши петли for указывают, что они будут представлять собой любую комбинацию 1 и 2.

Кроме того, внутри вашей for петли:

pic[i, j] = new PictureBox();            //  <-- will get overwritten by (*)
pic[i, j] = pic[i + 1, j + 1];           //  <-- will get overwritten by (*)
pic[i, j] = new PictureBox();            //  <-- (*)
pic[i, j].Image = Image.FromFile(...);

То есть вы можете удалить первые две строки.

1 голос
/ 05 декабря 2010

Я не знаю, почему вы пытаетесь сделать это так сложно, но предполагая, что рыцарь на picturebox34 или, другими словами, на pic[0, 4], и вы хотите переместить его вправо и вверх и, таким образом, закончить на pic[2, 3] тогда это не более чем

// Move knight image from 0,4 to 2, 3
pic[2, 3].Image = pic[0, 4].Image;

// Make old knight position empty
pic[0, 4].Image = null;

Понятия не имею, зачем вы делаете циклы for и все такое ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...