Ich möchte die Farbe einer bestimmten Zeile in meinem Datenfenster ändern. Die Zeile sollte in Rot geändert werden, wenn der Wert der Spaltenzelle 7 unter dem Wert in der Spaltenzelle 10 liegt. Vorschläge, wie Sie dies erreichen können?
Sie müssen die Zeilen in der Datenansicht durchlaufen und dann die Werte der Spalten 7 und 10 in jeder Zeile vergleichen.
Versuche dies:
foreach (DataGridViewRow row in vendorsDataGridView.Rows)
if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value))
{
row.DefaultCellStyle.BackColor = Color.Red;
}
Ich habe gerade dieses Problem untersucht (daher ist mir bekannt, dass diese Frage vor fast drei Jahren veröffentlicht wurde, aber vielleicht hilft sie jemandem ...), aber es scheint eine bessere Option zu sein, den Code in das RowPrePaint
-Ereignis zu platzieren, damit Sie nicht loslegen. Es muss jede Zeile durchlaufen werden, nur die, die gemalt werden (damit sie bei großen Datenmengen viel besser abschneidet:
An die Veranstaltung anhängen
this.dataGridView1.RowPrePaint
+= new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
this.dataGridView1_RowPrePaint);
Der Ereigniscode
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text))
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
}
Sie suchen nach dem Ereignis CellFormatting
.
Hier ist ein Beispiel.
Ich hatte auch Probleme, die Textfarbe zu ändern - ich habe nie gesehen, wie sich die Farbe verändert.
Bis ich den Code hinzugefügt habe, um die Textfarbe für DataBindingsComplete
für das Ereignis DataGridView
zu ändern. Danach hat es geklappt.
Ich hoffe, dass dies Menschen helfen wird, die das gleiche Problem haben.
Etwas wie das Folgende ... vorausgesetzt, die Werte in den Zellen sind Ganzzahlen.
foreach (DataGridViewRow dgvr in myDGV.Rows)
{
if (dgvr.Cells[7].Value < dgvr.Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
}
ungetestet, so entschuldigt sich für etwaige Fehler.
Wenn Sie die bestimmte Zeile kennen, können Sie die Iteration überspringen:
if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
Einige Leute verwenden gern die Ereignisse Paint
, CellPainting
oder CellFormatting
, beachten jedoch, dass das Ändern eines Stils in diesen Ereignissen rekursive Aufrufe verursacht. Wenn Sie DataBindingComplete
verwenden, wird es nur einmal ausgeführt. Das Argument für CellFormatting
ist, dass es nur für sichtbare Zellen aufgerufen wird. Sie müssen also nicht sichtbare Zellen nicht formatieren, sondern mehrmals formatieren.
Sie können Backcolor
Zeile für Zeile unter Verwendung Ihrer Bedingung ändern. Dieser Funktionsaufruf erfolgt nach Anwenden von Datasource
von DatagridView
.
Hier ist die Funktion für das . Einfach das kopieren und nach Databind
setzen
private void ChangeRowColor()
{
for (int i = 0; i < gvItem.Rows.Count; i++)
{
if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD");
else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9");
else if (BindList[i].MainID > 0)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7");
else
gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}
private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e)
{
dtGrdVwRFIDTags.Refresh();
this.dtGrdVwRFIDTags.Columns[1].Visible = false;
foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows)
{
if (row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Lost"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Damaged"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Discarded")
{
row.DefaultCellStyle.BackColor = Color.LightGray;
row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
}
else
{
row.DefaultCellStyle.BackColor = Color.Ivory;
}
}
//for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++)
//{
// if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged")
// {
// dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;
// }
//}
}
Dies ist meine Lösung, um mithilfe von bindingDataSource die Farbe in dataGridView zu ändern:
private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (e.ListChangedType != ListChangedType.ItemDeleted)
{
DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone();
green.BackColor = Color.Green;
DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone();
gray.BackColor = Color.LightGray;
foreach (DataGridViewRow r in this.dataGridViewECO.Rows)
{
if (r.Cells[8].Value != null)
{
String stato = r.Cells[8].Value.ToString();
if (!" Open ".Equals(stato))
{
r.DefaultCellStyle = gray;
}
else
{
r.DefaultCellStyle = green;
}
}
}
}
}
Wenn Sie an eine (Sammlung) konkreter Objekte binden, können Sie dieses konkrete Objekt über die DataBoundItem-Eigenschaft der Zeile abrufen. (Um zu vermeiden, dass nach magischen Zeichenketten in der Zelle gesucht wird und "echte" Eigenschaften des Objekts verwendet werden.)
Skelett-Beispiel unten:
DTO/POCO
public class Employee
{
public int EmployeeKey {get;set;}
public string LastName {get;set;}
public string FirstName {get;set;}
public bool IsActive {get;set;}
}
Bindung an den Datagridview
private void BindData(ICollection<Employee> emps)
{
System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList());
this.dgvMyDataGridView.DataSource = bindList;
}
dann den Event-Handler und Abrufen des konkreten Objekts (anstelle von DataGridRow und/oder Zellen)
private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee;
if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive)
{
dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
}
}
Normalerweise möchte ich dafür das Ereignis GridView.RowDataBound verwenden.
protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.ForeColor = System.Drawing.Color.Red;
}
}
Mit diesem Code ändern Sie nur die Hintergrundfarbe der Zeilen, wobei der Wert für columname null ist. Die andere Zeilenfarbe ist immer noch die Standardfarbe.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["columnname"].Value != null)
{
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
}
}
Nur ein Hinweis zur Einstellung von DefaultCellStyle.BackColor
... Sie können keinen transparenten Wert festlegen, außer Color.Empty
. Das ist der Standardwert. Das bedeutet fälschlicherweise (für mich jedenfalls), dass transparente Farben in Ordnung sind. Sie sind nicht. Jede Reihe, für die ich eine transparente Farbe einstelle, zeichnet nur die Farbe der ausgewählten Reihen.
Ich habe zu viel Zeit damit verbracht, meinen Kopf wegen dieses Problems gegen die Wand zu schlagen.
Ich bin hier gelandet, auf der Suche nach einer Lösung für den Fall, dass ich keine Datenbindung verwende. Nichts hat für mich funktioniert, aber ich habe es am Ende mit:
dataGridView.Columns.Clear();
dataGridView.Rows.Clear();
dataGridView.Refresh();
Sie haben nicht erwähnt, wie der Wert geändert wird. Ich habe eine ähnliche Funktion verwendet, wenn der Benutzer einen Wert eingibt. in den Bearbeitungsmodus eintreten und diesen verlassen.
Verwendung von CellEndEdit event von datagridview.
private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
double newInteger;
if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger)
{
if (newInteger < 0 || newInteger > 50)
{
dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText
= "Keep value in Range:" + "0 to " + "50";
}
}
}
Auf ähnliche Weise können Sie eine Logik zum Löschen der Fehlermeldung hinzufügen.
wenn in Ihrem Fall Daten programmgesteuert geladen werden, kann CellLeave event mit demselben Code verwendet werden.
int counter = gridEstimateSales.Rows.Count;
for (int i = 0; i < counter; i++)
{
if (i == counter-1)
{
//this is where your LAST LINE code goes
//row.DefaultCellStyle.BackColor = Color.Yellow;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
else
{
//this is your normal code NOT LAST LINE
//row.DefaultCellStyle.BackColor = Color.Red;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}
Funktioniert mit Visual Studio 2010. (Ich habe es ausprobiert und es funktioniert!) Es wird Ihre gesamte Reihe malen.
datagridview
.CellClick
-Ereignis und fügen Sie die nächste Codezeile ein.if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)
{
dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}