2016-05-04 1 views
-1

Я создал 4x4 TableLayoutPanel, заполненный Labels. Я хотел был бы изменить BackColor одного случайно Label на Button_Click. Я не знаю, как это сделать. Вот то, что я до сих пор:Изменение цвета фона случайной метки

public partial class Form1 : Form 
{ 
    Label[,] labelki = new Label[4, 4]; 
    Random los = new Random(); 
    Label wylosowanyLabel = null; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void ZmienKolor() 
    { 
     int i = los.Next(1, 4); 
     int j = los.Next(1, 4); 
     wylosowanyLabel = labelki[i, j]; 
     wylosowanyLabel.BackColor = Color.Red; //I get a NullReferenceException here 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer1.Start(); 
     ZmienKolor(); 
    } 
} 
+1

Что ваша проблема именно? Вы получаете сообщение об ошибке? Вы должны быть более конкретными в своей проблеме. –

+0

Вы должны прикрепить обработчик к событию нажатия кнопки. Добавьте 'buttonname.Click + = (s, o) => {ChangeColor()};' после 'InitializeComponenet();' в вашем конструкторе форм. – dotctor

+0

Код, который вы отправили, никогда не заполняет массив 'labelki', поэтому вы получаете исключение для ссылки на null. –

ответ

0

Вам не нужен этот массив, на самом деле. вы можете использовать коллекцию элементов управления TableLayoutPanel. Попробуйте это:

// on the class level: 
private int _LabelIndex; 

// on the method you want to use for changing the backColor of a lable: 


// you might want to change the backcolor of all other lables back to SystemColors.Control. 
// if that is the case, you can do something like this: 
this.tableLayoutPanel1.Controls.OfType<Label>().ToList().ForEach(c => c.BackColor = SystemColors.Control); 

_LabelIndex = los.Next(0, this.tableLayoutPanel1.Controls.Count); 
this.tableLayoutPanel1.Controls[labelIndex].BackColor = Color.Red; 

Создать общий обработчик событий для всех меток внутри панели таблицы lauout и получить индекс щелкнутого управления:

private void labels_click(object sender, EventArgs e) 
{ 
    var clickedLabel = (Label)sender; 
    var index = this.tableLayoutPanel1.Controls.IndexOf(clickedLabel); 
    if(index == _LabelIndex) 
    { 
     // used have clicked the red label. 
    } 
} 
+0

Этот код работает так, как я этого хотел, поэтому спасибо за это. Моя проблема теперь в том, как я могу обратиться к этой метке labelIndex из другого метода. Переменная Var не может быть объявлена ​​глобально, и я действительно не знаю, как я должен это делать в противном случае. Я хочу проверить, нажал ли пользователь этот ярлык, но я не знаю, как отправить его этому методу проверки. Заранее благодарю –

+0

Для этого можно использовать переменную int для класса. –

+0

Но как сравнить этикетку, нажатую пользователем с нарисованной? Простое преобразование, подобное 'if (kliknietyLabel! = Convert (Label, LabelIndex))' не работает –

0

Вы не создаешь экземпляр этикеток внутри массива. Вы должны создать новый экземпляр каждой метки первого:

public Form1() 
{ 
    InitializeComponent(); 
    for (int i = 0; i < 4; i++) 
    { 
     for (int j = 0; j < 4; j++) 
     { 
      labelki[i,j] = new Label(); 
     } 
    } 
} 

Также в методе ZmienKolor вы должны генерировать случайные числа между 0 и 4 вместо 1 и 4:

int i = los.Next(0, 4); 
int j = los.Next(0, 4); 
Смежные вопросы