Laden...

DataGridView Zellfarbe verändern

Erstellt von 11.08.2006 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.829 Views
1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren
DataGridView Zellfarbe verändern

Ich möchte die Farbe einzelner Zellen meines DataGridViews abhängig von ihrem Inhalt verändern. Wie greift man auf das Farbattribut einzelner Zellen zu?

245 Beiträge seit 2005
vor 17 Jahren

Habs zwar noch nicht ausprobiert, aber es gibt die Eigenschaft Style, welche vom Typ DataGridViewCellStyle ist und wiederum eine BackColor-Eigenschaft besitzt...

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

ich habe das Problem, dass ich den Inhalt der Zelle mit

dgv_ = "blub" zwar schreiben kann, aber ansonsten keine weitere möglichkeit habe, diese zelle zu manipulieren.

245 Beiträge seit 2005
vor 17 Jahren

Die Zelle kannst du mit dem eindimensionalen Array wohl gar nicht ansprechen, dafür brauchst du schon 2 Indizess (Spalten- und Zeilen-Index).

Der entsprechende Code zum verändern der Zellen-Hintergrundfarbe sollte zB. folgendermaßen aussehen (nicht getestet):


colIndex = 3;
rowIndex = 15;
dgv[colIndex, rowIndex].Style.BackColor = Color.Blue;

Alternativ kannst du statt dem Spalten-Index auch den Spalten-Namen verwenden.

ps.: Prüfen, ob die Indizess überhaupt gültig sind nicht vergessen!

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

Doch geht eindimensional, denn ich beziehe mich immer auf die Zeile in der ich gerade bin.

ICh erzeuge eine Zeile mit


DataRow dr =  table.NewRow();
table.Rows.Add(dr);

und kann dann z.B. über



dr[0]


auf die erste Zelle zugreifen.

Allerdings bekomme keine Eigenschaften mit dr[0]. angezeigt, da gibt es nur 4 Methoden wie equals....

245 Beiträge seit 2005
vor 17 Jahren

Ok, jetzt versteh ich das Problem 😉

Du kannst den Style natürlich nicht auf die DataRow anwenden. Diese dient nur der Datenhaltung, nicht aber der Darstellung.

Um die Darstellung kümmert sich (davon geh ich aufgrund deines 1. Postings zumindest aus) das DataGridView.

Dh. die musst dir die entsprechende Zelle aus dem !DataGridView! holen und der dann die BackColor, wie oben beschrieben zuweisen.

Wenn du die Zelle nicht jedesmal, wenn sich etwas ändert extra holen und editieren willst kannst du auch das CellFormating-Event des DataGridViews abonnieren, in welchem du dann prüfst, ob der aktuellen Zelle eine andere BackColor zugewiesen werden soll.

Kleiner Beispielcode:


private void MyDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  if ((e.ColumnIndex == 3) && (e.Value.ToString() == "red"))
    myDataGridView[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
  }
}

Erklärung: Wird in der 4. Spalte (ColumnIndex == 3) der Wert "red" eingetragen, wird die Hintergrundfarbe dieser Zelle auf Rot gesetzt...

Hoffe, dir damit weitergeholfen zu haben. Weiters würden dir viele hier wahrscheinlich empfehlen, ein gutes Buch oder Tutorial durchzuarbeiten.

mfg

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

Hallo suamikim,

danke für Deine Antwort, das sieht ja schon mal nicht schlecht aus. Leider funktioniert es immer noch nicht.

Ich möchte die Zelle, die ich zuletzt beschrieben habe entsprechend Ihrem Wert einfärben, diesen Wert hole ich mir aus einer anderen Variable und nicht aus der Zelle.

Dazu habe ich direkt, nachdem ich den Wert in die Zelle schreibe, die Zeile
dataGridView1[0,1].Style.BackColor = Color.Red; eingefügt.

Allerdings ändert sich dann überhaupt nichts an meiner Tabelle.

Meine Software erzeugt in einer Schleife ständig neue Zeilen und hängt diese an meiner Tabelle an.

D
496 Beiträge seit 2005
vor 17 Jahren

mit der klasse sollte es gehen.


using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace OOP
{
	/// <summary>
	/// In dieser Kalsse werden kontextabhähnige Formatierungen von Spalten oder Zeilen vorgenommen
	/// </summary>
	public class ColumnStyle
	{
        public static void cellColor(DataGridView dataGridViewLocal,int column,double threshold )
        {
            // Create a new green style.
            DataGridViewCellStyle greenStyle = new DataGridViewCellStyle();
            {
                greenStyle.BackColor = Color.Green;
                greenStyle.ForeColor = Color.Green;
            }

            // Create a new red style.
            DataGridViewCellStyle redStyle = new DataGridViewCellStyle();
            {
                redStyle.BackColor = Color.Red;
                redStyle.ForeColor = Color.Red;
            }

            // Create a new yellow style.
            DataGridViewCellStyle yellowStyle = new DataGridViewCellStyle();
            {
                yellowStyle.BackColor = Color.Yellow;
                yellowStyle.ForeColor = Color.Yellow;
            }

            for (int rowCounter = 0; rowCounter < dataGridViewLocal.RowCount; rowCounter++)
            {
                double cellValue = (double)dataGridViewLocal.Rows[rowCounter].Cells[column].Value;

                if (cellValue < threshold)
                    dataGridViewLocal.Rows[rowCounter].Cells[column].Style = redStyle;
                else if (cellValue > threshold)
                    dataGridViewLocal.Rows[rowCounter].Cells[column].Style = greenStyle;
                else
                    dataGridViewLocal.Rows[rowCounter].Cells[column].Style = yellowStyle;
            }
        }


}  

}

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

Danke für Eure Hilfe, in der Zwischenzeit kam mir auch noch ein brauchbarer Gedanke:



private void ColorizeTable(int Columns)
        {
            for (int i = 1; i < Columns+1; i++)
            {
                for (int j = 1; j < 17; j++)
                {
                    if (dataGridView1[j, i].Value.ToString() == "no data")
                    {
                        dataGridView1[j, i].Style.BackColor = Color.HotPink;
                    }
                    else if (dataGridView1[j, i].Value.ToString() == "100%")
                    {
                        dataGridView1[j, i].Style.BackColor = Color.LimeGreen;
                    }
                    else if (dataGridView1[j, i].Value.ToString() == "0%")
                    {
                        dataGridView1[j, i].Style.BackColor = Color.Red;
                    }
                    else 
                    {
                        dataGridView1[j, i].Style.BackColor = Color.Yellow;
                    }
                    
                }
            }
        }


245 Beiträge seit 2005
vor 17 Jahren

Ist zwar nicht mehr relevant, aber ich verstehe nicht so ganz, warum meine Variante oben mit dem CellFormating-Event nicht funktioniert? Im Prinzip machst du jetzt auch nicht viel anders, nur dass du die Zeilen/Spalten des DataGridViews manuell durchläufst und den Inhalt der Zellen prüfst.

Konkret auf deine Funktion angepasst, sähe meine Lösung folgendermaßen aus:


		private void MyDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
		{
			String valueString = e.Value.ToString();
			DataGridViewCell actCell = actDataGridView[e.ColumnIndex, e.RowIndex];

			if (valueString == "no data")
				actCell.Style.BackColor = Color.HotPink;
			else if (valueString == "100%")
				actCell.Style.BackColor = Color.LimeGreen;
			else if (valueString == "0%")
				actCell.Style.BackColor = Color.Red;
			else
				actCell.Style.BackColor = Color.Yellow;
		}

Ich persönlich würde dir die Methode mit dem CellFormatting-Event raten, da dieses 1. für solche Sachen da ist und du es 2. nicht nach jeder Änderung in den Daten selbst aufrufen musst...

mfg