web-dev-qa-db-de.com

Wie kann ich die Zeilenfarbe in datagridview ändern?

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?

120
EB.

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; 
     }
169
Ricardo Sanchez

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;
    }
}
53
Eden

Sie suchen nach dem Ereignis CellFormatting .
Hier ist ein Beispiel.

22
SLaks

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.

21
user1614017

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;
}
13
Demi

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.

7
Denise Skidmore

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;
    }
}
4
pratik1020
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;                   
    //    }
    //}
}
3
christopher

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

        }

    }
}
1
daniele3004

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;
            }
        }
1
granadaCoder

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;
    }
}
0
Edison

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;
                    }
                 }
0
bencemik95

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.

0
ulatekh

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();
0
Gogu CelMare

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.

0

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;
            }
        }
0
Amit Patil

Funktioniert mit Visual Studio 2010. (Ich habe es ausprobiert und es funktioniert!) Es wird Ihre gesamte Reihe malen.

  1. Erstellen Sie eine Schaltfläche für datagridview.
  2. Erstellen Sie ein 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;
}
0
Levi