2016-08-03 14 views
1

Ich versuche, die Hintergrundfarbe einer Tabellenzelle in einem TableLayoutPanel programmgesteuert zu ändern. Die Zellen können entweder null sein oder während der Laufzeit von einem Benutzersteuerelement übernommen werden (immer wechselnd).C# Hintergrundfarbe einer Tabellenzelle ändern inTableLayoutPanel

ich dies tat:

TableName.GetControlFromPosition(column, row).BackColor = Color.CornflowerBlue; 

Natürlich funktioniert dies nur, wenn es etwas zu dieser Zelle ist. Wie kann ich zur Laufzeit auch die Eigenschaften einer Nullzelle ändern?

Antwort

1

Beachten Sie, dass es wirklich keine solche Sache gibt TableLayoutPanelCell. Die "Zellen" sind streng virtuell.

Sie verwenden, um die CellPaint Ereignis jede BackColor auf jede ‚Zelle‘ zu ziehen, leer oder nicht:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 

    if (e.Row == e.Column) 
     using (SolidBrush brush = new SolidBrush(Color.AliceBlue)) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
    else 
     using (SolidBrush brush = new SolidBrush(Color.FromArgb(123, 234, 0))) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
} 

enter image description here

Natürlich sind die Farben und die Bedingungen sind bis zu Ihnen ..

Update: Beachten Sie noch einmal, dass Sie eine bestimmte "Zelle" nicht färben können, da keinesind! Keine solche Klasse, weder Kontrollen noch Objekte. Es existiert einfach nicht! Ein TLP ist nicht bestehend aus "Zellen". Es besteht nur aus Zeilen und Spalten.

Um eine 'Zelle' zu färben, müssen Sie eine geeignete Bedingung im CellPaint Ereignis kodieren, das ist das nächste .NET kommt zur Verwendung des Namens 'Zelle'.

Sie können einfache Formeln oder explizite Aufzählungen verwenden, um das gewünschte Farblayout je nach Ihren Anforderungen zu erstellen.

Hier sind zwei aufwändigere Beispiele:

Für ein einfaches Schachbrett Layouts verwenden diese Bedingung:

if ((e.Row + e.Column) % 2 == 0) 

Für ein Freiform Layouts sammeln alle Farbwerte in einem Dictionary<Point>, Color;

Dictionary<Point, Color> cellcolors = new Dictionary<Point, Color>(); 
cellcolors.Add(new Point(0, 1), Color.CadetBlue); 
cellcolors.Add(new Point(2, 4), Color.Blue); 
.. 
.. 
.. 

und schreiben:

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e) 
{ 
    if (cellcolors.Keys.Contains(new Point(e.Column, e.Row))) 
     using (SolidBrush brush = new SolidBrush(cellcolors[new Point(e.Column, e.Row)])) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
    else 
     using (SolidBrush brush = new SolidBrush(defaultColor)) 
      e.Graphics.FillRectangle(brush, e.CellBounds); 
} 
+0

Wie kann ich angeben, welche Zelle mit diesem Ereignis eingefärbt werden soll? 'TableLayoutCellPaintEvenArgs' hat nur' Get' für die 'Row' und' Column', also kann ich diese Werte nicht setzen. Ich habe ein 2D-Array, das die Tabelle darstellt, die mit 1 und 0 (immer ändernden) gefüllt ist. Ich möchte die Zellen färben, wo eine "1" im Array ist. Gerade jetzt malt das Event den ganzen Tisch, egal wie der Zustand ist. –

+1

Dieses Ereignis wird für jede 'Zelle' und bei jeder Aktualisierung aufgerufen. Um die Farben bestimmter Zellen festzulegen, müssen Sie ihre Zeilen-/Spaltenindizes in den Bedingungen codieren. Abhängig von Ihren Bedürfnissen kann dies so einfach wie eine Formel oder so langweilig wie das Aufzählen jeder Zelle sein. Sehen Sie mein Update für zwei weitere Beispiele! - Du hast geschrieben: _Richtig, das Ereignis malt die ganze Tabelle, egal wie die Bedingung ist. Das ist sicherlich nicht wahr, oder besser: Ja, alle 'Zellen' werden immer mit diesem Ereignis bemalt, aber immer entsprechend der Bedingung, die du schreibst__. – TaW

+0

Vielen Dank! Es macht jetzt alles Sinn. –

1

Wenn die Zelle null ist, können Sie ihre BackColor-Eigenschaft nicht festlegen. Wenn Sie die Farbe festlegen, sollten Sie prüfen, ob sie null ist. Und Sie können die Farbe der Steuerelemente in den Zellen statt der BackColor der Zelle festlegen. example

+0

Haben Sie Vorschläge, wie ich es dann tun? Ich habe 64 Zellen. Ich dachte daran, 64 Tafeln zu machen und eine in jede Zelle zu legen. Dann setzen Sie die Benutzersteuerelemente in jedes Panel. Was denken Sie? –

+1

yeah natürlich können Sie bekommen, was Sie wollen, als was Sie sagen. Ich tat wie du sagst. \t 'private void Form1_Load (Objekt Absender, EventArgs e) { panel1.BackColor = Farbe.Grün; panel2.BackColor = Color.Red; panel5.BackColor = Color.Yellow; panel7.BackColor = Color.SeaGreen; } ' können Sie die BackColor eines beliebigen Bereichs festlegen. – Gry

Verwandte Themen