2016-05-04 13 views
-1

Ich habe ein 4x4 TableLayoutPanel erstellt mit Labels gefüllt. Ich würde gerne BackColor von einem zufälligen Label bei Button_Click ändern. Ich bin mir nicht sicher, wie ich es tun muss. Hier ist das, was ich bisher:Ändern der Hintergrundfarbe eines zufälligen Labels

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

Was ist Ihr Problem genau? Erhalten Sie eine Fehlermeldung? Sie müssen genauer auf Ihr Problem eingehen. –

+0

Sie müssen einen Handler an Ihr Button-Click-Ereignis anhängen. Fügen Sie 'buttonname.Click + = (s, o) => {ChangeColor()}; nach' InitializeComponenet(); 'in Ihrem Formularkonstruktor hinzu. – dotctor

+0

Der von Ihnen gepostete Code füllt niemals das 'labelki'-Array, daher erhalten Sie eine Null-Referenz-Ausnahme. –

Antwort

0

Sie brauchen nicht das Array, eigentlich. Sie können die Controls-Auflistung von TableLayoutPanel verwenden. Try this:

// 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; 

einen gemeinsamen Event-Handler in der Tabelle lauout Tafel für alle Etiketten erstellen und den Index der geklickten Kontrolle bekommen:

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

Dieser Code funktioniert, wie ich es wollte, also danke dafür. Mein Problem ist jetzt, wie kann ich dieses Etikett labelIndex von einer anderen Methode ansprechen. Var-Variable kann nicht global deklariert werden und ich weiß nicht, wie ich es sonst tun soll. Ich möchte überprüfen, ob der Benutzer auf dieses Label geklickt hat, aber ich weiß nicht, wie ich es an diese Prüfmethode senden soll. Vielen Dank im Voraus –

+0

Sie können dafür eine int-Variable auf Klassenebene verwenden. –

+0

Aber wie kann ich die vom Benutzer angeklickte Beschriftung mit der gezeichneten vergleichen? Einfaches Konvertieren wie 'if (kliknietyLabel! = Konvertieren (Label, LabelIndex))' funktioniert nicht –

0

Sie nicht eine Instanz Ihrer Etiketten erstellt hat innerhalb des Arrays. Sie sollten zunächst eine neue Instanz von jedem Etikett erstellen:

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

Auch in der ZmienKolor Methode sollten Sie Zufallszahl zwischen 0 erzeugen und 4 statt 1 und 4:

int i = los.Next(0, 4); 
int j = los.Next(0, 4);