2016-04-11 3 views
2

Ich habe eine DataGridView und ich möchte dem Operator zeigen, welche Werte geändert werden, indem Sie diesen Werten eine andere ForeColor geben. Der Bediener kann entscheiden, alle Änderungen zu verwerfen, indem er auf die Schaltfläche Verwerfen klickt. In diesem Fall muss die Zelle die ererbten Stile verwenden.Wie man DataGridViewCellStyle auf seinen geerbten Wert zurücksetzt

Mein Problem ist, dass, sobald ich ein CellStyle erstellt, um anzugeben, dass es geändert wird, kann ich dies nicht rückgängig machen, so dass die Zelle den geerbten Stil verwendet.

Ich habe etwas recherchiert. In dem Artikel Cell Styles in the Windows Forms DataGridView Control MSDN warnt:

die Werte in der Zelle der Style-Eigenschaft wichtig gespeichert Caching ist unabhängig davon, ob ein bestimmte Stil Wert eingestellt ist. Wenn Sie eine Stileinstellung vorübergehend ersetzen, stellt die Wiederherstellung auf den ursprünglichen Zustand "not set" sicher, dass die Zelle die Einstellung von einer höheren Ebene übernimmt.

Ach, das scheint nicht zu funktionieren:

DataGridViewCell cell = ...; 

Debug.Assert(!cell.HasStyle);   // cell is not using its own style 
var cachedColor = cell.Style.ForeColor; // cache the original color 
cell.Style.ForeColor = Color.Red;  // indicate a change 
Debug.Assert(cell.HasStyle);   // now cell is using its own style 

// restore to the 'not set' state: 
cell.Style.ForeColor = cachedColor; 
Debug.Assert(!cell.HasStyle);   // exception, not using inherited style 
cell.Style = cell.InheritedStyle;  // try other method to restore 
Debug.Assert(!cell.HasStyle);   // still exception 

So Frage: Wie der Stil Einstellung zu seinem ursprünglichen „nicht gesetzt“ Zustand wiederherstellen?

Antwort

1

Es scheint, ich hatte ein komplettes Missverständnis über Cell.Style und Cell.InheritedStyle.

Ich dachte, dass der geerbte Stil der Stil von der Zeile/alternierenden Zeile/DataGridView geerbt wurde, und dass der Stil der resultierende Stil war.

NICHT!

Der resultierende Stil ist DataGridViewCell.InheritedStyle. Dieser Stil entspricht dem DataGridViewCell.Style, oder wenn dieser einen Nullwert hat, entspricht er dem Stil von DataGridViewRow.InheritedStyle, der wiederum dem Wert von DataGridViewRow.DefaultStyle entspricht, oder wenn dies null ist, der DataGridView.AlternatingRowsDefaultCellStyle usw.

Um zu wissen, welcher Stil tatsächlich verwendet wird, rufen Sie DataGridViewCell.InheritedStyle ab, um einen bestimmten Stil anzugeben, ändern Sie die Eigenschaften von DataGridViewCell.Style, die automatisch erstellt und mit den vererbten Werten gefüllt werden, wenn Sie sie erhalten.

Um den DataGridViewCell.Style zu verwerfen, setzen Sie ihn einfach auf null. Danach ist DataGridViewCell.HasStyle false und DataGridViewCell.InheritedStyle ist der von den Alternating Rows/all Rows geerbte Stil.

Beispiel: - eine Schaltfläche „Ändern“ wird die Vordergrundfarbe der aktuellen Zelle zu rot und die Backcolor der kompletten Reihe an Aliceblue ändern - eine Schaltfläche „Verwerfen“ auf die Standardeinstellungen wiederherstellen Zellenformate

private void buttonChange_Click(object sender, EventArgs e) 
{ 
    DataGridViewCell cell = this.dataGridView1.CurrentCell; 
    DataGridViewRow row = cell.OwningRow; 

    if (!row.HasDefaultCellStyle) 
    { 
     row.DefaultCellStyle.BackColor = Color.AliceBlue; 
    } 

    if (!cell.HasStyle) 
    { 
     cell.Style.ForeColor = Color.Red; 
    } 
} 

Ergebnis: die aktuelle Zelle mit roter Vordergrundfarbe, die aktuelle Zeile wird mit Aliceblue Hintergrundfarbe

private void buttonDiscard_Click(object sender, EventArgs e) 
{ 
    DataGridViewCell cell = this.dataGridView1.CurrentCell; 
    DataGridViewRow row = cell.OwningRow; 

    if (row.HasDefaultCellStyle) 
    { 
     row.DefaultCellStyle = null; 
     Debug.Assert(!row.HasDefaultCellStyle); 
    } 
    if (cell.HasStyle) 
    { 
     cell.Style = null; 
     Debug.WriteLine(!cell.HasStyle); 
    } 
} 

Ergebnis gezeigt wird angezeigt: die aktuelle Zelle und aktuelle Zeile mit ihrem Ursprung gezeigt al Farben

Verwandte Themen