2009-02-25 30 views
12

Ich habe ein großes DataGridView-Steuerelement, das mehrere Zellen enthält, von denen die meisten eine Schaltfläche enthalten. Wie kann ich die Farbe dieser Tasten ändern?Farbe der Schaltfläche in DataGridView-Zelle ändern

Dies ändert die "Gliederung" der Schaltfläche, aber nicht die Schaltfläche selbst.

row.Cells[2].Style.BackColor = System.Drawing.Color.Red; 

Dies scheint nicht, etwas zu ändern, die sichtbar ist:

row.Cells[2].Style.ForeColor = System.Drawing.Color.Red; 

Wenn es nicht möglich ist, den Hintergrund zu ändern, ist es möglich, die Schriftart auf der Schaltfläche ändern?

Verwenden von .NET 2.0.

Antwort

13

Per MSDN:

Wenn visuelle Stile aktiviert sind, die Tasten in einer Tastenspalte sind bemalt eine ButtonRenderer verwenden und Zelle Stile durch Eigenschaften angegeben wie DefaultCellStyle haben keine Wirkung.

Daher haben Sie eine von zwei Möglichkeiten. In Ihrem Program.cs können Sie diese Zeile entfernen:

Application.EnableVisualStyles(); 

, die es funktionieren wird, aber alles andere sehen aus wie Mist machen. Ihre andere Option, und Sie werden diese nicht mögen, ist von DataGridViewButtonCell erben und überschreiben Sie die Paint() -Methode. Sie können dann die statische Methode ButtonRenderer Klasse DrawButton verwenden, um den Button selbst zu malen. Das heißt, herauszufinden, in welchem ​​Zustand sich die Zelle gerade befindet (angeklickt, schweben usw.) und die Ecken und Ränder bemalen usw. Sie bekommen die Idee, es ist machbar, aber ein GROSSER Schmerz.

Wenn Sie wollen, obwohl zu, hier ist nur ein Beispielcode für den Anfang:

//Custom ButtonCell 
public class MyButtonCell : DataGridViewButtonCell 
    { 
     protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) 
     { 
      ButtonRenderer.DrawButton(graphics, cellBounds, formattedValue.ToString(), new Font("Comic Sans MS", 9.0f, FontStyle.Bold), true, System.Windows.Forms.VisualStyles.PushButtonState.Default); 
     } 
    } 

Dann ist hier ein Test Datagridview:

DataGridViewButtonColumn c = new DataGridViewButtonColumn(); 
      c.CellTemplate = new MyButtonColumn(); 
      this.dataGridView1.Columns.Add(c); 
      this.dataGridView1.Rows.Add("Click Me"); 

All dies Stichprobe ist eine Schaltfläche malen mit Die Schriftart ist "Comic Sans MS". Der Status der Schaltfläche wird nicht berücksichtigt, wie Sie beim Ausführen der App sehen.

GOOD GLÜCK !!

+0

In meinem Fall musste ich dann auch die Schaltfläche selbst Teile von Zellen rendern, also Gitterlinien etc. Als eine schnelle-n-dreckige Lösung kann man base.Paint (...), die DEFLATE cellBounds von einem Paar nennen von Pixel (um sicherzustellen, dass der Bereich um die Schaltfläche bleibt), und dann ButtonRenderer.DrawButton – Alex

1

Wenn diese Zellen eine Schaltfläche enthalten, bin ich mir ziemlich sicher, dass Sie auf die Eigenschaft BackColor dieser Schaltfläche zugreifen müssen. Ie. Holen Sie den Wert der Zelle, konvertieren Sie sie in eine Schaltfläche und legen Sie ihre Eigenschaft fest.

+1

Ja, die BackColor-Eigenschaft ist da und ändert die Umrisse der Schaltfläche nicht die Schaltfläche selbst. Ich musste den FlatStyle des Buttons eigentlich auf "Popup" oder "Flat" umstellen, damit er funktioniert. – Dave

0

Ich glaube, du Zugriff es falsch:

row.Cells[2].Style.BackColor = System.Drawing.Color.Red; 

Sie sagen, aktualisiert die „Kontur“ der Taste, aber es ist wirklich die Zelle hinter der Schaltfläche aktualisieren.

so etwas wie dies funktionieren sollte:

row.Cells[2].ButtonName.Style.BackColor = System.Drawing.Color.Red; 
25

Ich vermisste Dave's Notiz über Tomas Antwort, also poste ich nur die einfache Lösung dafür.

Aktualisieren Sie die FlatStyle Eigenschaft der Button-Spalte auf Popup, und aktualisieren Sie dann die Backcolor und Forecolor, können Sie das Aussehen der Schaltfläche ändern.

DataGridViewButtonColumn c = (DataGridViewButtonColumn)myGrid.Columns["colFollowUp"]; 
c.FlatStyle = FlatStyle.Popup; 
c.DefaultCellStyle.ForeColor = Color.Navy; 
c.DefaultCellStyle.BackColor = Color.Yellow; 
+0

Ich hatte gerade dieses Problem und Ihre Lösung hat mir geholfen. Vielen Dank! – NickAldwin

+0

Hässlich, aber es funktioniert ohne einen ganzen Haufen Müll. –

0

Es ist absolut genug, um Ihre eigene Klasse von DataGridViewButtonCell mit einer benutzerdefinierten Paint Methode abgeleitet zu machen, ohne EnableVisualStyles() zu entfernen.

1

Die Standardschaltfläche in einem DataGridView wird mit dem ButtonRenderer gezeichnet, was das Überschreiben erschwert. Wenn ich du wäre, würde ich den Button FlatStyle auf "Popup" setzen.

DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)dataGridMappings.Rows[0].Cells[0]; 
buttonCell.FlatStyle = FlatStyle.Popup; 
buttonCell.Style.BackColor = System.Drawing.Color.Red; 
Verwandte Themen