DataGridView - farbige Zellen und Sortierungen

benji2010

Grünschnabel
Hallo zusammen,

da ich berufsmäßig wieder mit VB2008 EE zu tun habe und gleich vor einigen Problemen stehe, bitte ich hiermit um Hilfe.

Ich möchte ein Programm erstellen, welches mir Aufträge aufzeigt. (siehe Anhang)
Ich habe bereits die Daten von Access hinzugefügt. Nun möchte ich gerne das
die Zellen von Aufträgen, bei denen das Datum (Vorgangstart) hinter dem aktuellen Datum liegt, rosa dargestellt sind.

Gerne möchte ich auch, dass wenn ich auf einen Button klicke, nur bestimmte Maschinen angezeigt werden. (z.B. CHDVSH) Also ein Filter...

Ist dies überhaupt möglich ? Wenn ja wie komplex und wie und wo fange ich am Besten an ? Habe zwar bereits einige Stunden Internetrecherche hinter mir, jedoch ohne richtigen Erfolg.

Danke im Voraus,
Benjamin
 

Anhänge

  • Programm.JPG
    Programm.JPG
    192,7 KB · Aufrufe: 107
das ist ne coole sache, diese Zeilen zu färben =)

das ganze schaut so aus....

Inm folgenden code wird NACH DEM sortieren meine Paint methode aufgerufen...
dort frage ich nach warenausgang unf färbe diese zeilen rot und dann suche ich nach wareneingang und färbe diese zeilen rot.

du würdest nach datum größer oder kleiner heute fragen =)
Code:
 private void dataGridView1_Sorted(object sender, EventArgs e)
        {
            PaintRows();
        }

        private void PaintRows()
        {
            for (int i = 0; i <= dataGridView1.RowCount - 1; i++)
            {
                if (dataGridView1.Rows[i].Cells["Vorgang"].Value.ToString() == "Wareneingang")
                {
                    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Green;
                }
                else if (dataGridView1.Rows[i].Cells["Vorgang"].Value.ToString() == "Warenausgang")
                {
                    dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Red;
                }
            }
        }
 
Statt das ganze mit einer For-Schleife zu machen kann man diese auch einfach durch eine foreach-schleife ersetzen, also:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["Vorgang"].Value.ToString() == "Wareneingang")
{
row.DefaultCellStyle.BackColor = Color.Green;
}
else if (row.Cells["Vorgang"].Value.ToString() == "Warenausgang")
{
row.DefaultCellStyle.BackColor = Color.Red;
}
}

Bringt nicht so viel, aber man spart sich Etwas Quellcode und kann sich dann später, wenn man sich das ganze nochmal anguckt noch genau was man da eigentlich macht.
Nur so eine Idee.
 
Ich habe bereits die Daten von Access hinzugefügt.
Doch wohl hoffentlich über eine BindingSource!? Das vereinfacht nämlich die Filterung:

Code:
		private void buttonFilter_Click(object sender, EventArgs e)
		{
			var bs = dgvAnzeige.DataSource as BindingSource;
			if (String.IsNullOrEmpty(bs.Filter))
			{
				bs.Filter = String.Format("Maschine='{0}'", "CHDVSH");
				//--oder vereinfacht:
				//bs.Filter = "Maschine='CHDVSH'";
			}
			else   //--Filer wieder aufheben
			{
				bs.Filter = String.Empty;
			}
		}
Im Codebeispiel gehe ich vereinfacht davon aus, dass das zu filternde Feld in der Tabelle 'Maschine' heisst...

Nun zum bedingten Einfärben von Zellen (bzw auch ganzen Zeilen):
Wir lassen das DGV sich seine Zellen quasi selbst zeichnen
Code:
		private void dgvAnzeige_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
		{
			DataGridView dgv = (DataGridView)sender;

			if (e.RowIndex < 0)
				return;

			var rwCurrent = ((System.Data.DataRowView)dgv.Rows[e.RowIndex].DataBoundItem).Row;

			if (Convert.ToDateTime(rwCurrent["VorgangStart"]) < DateTime.Today)
				{
				e.CellStyle.BackColor = Color.LightCoral;
			}
		}
Da das CellPainting-Event bei JEDER Zelle gefeuert wird, reicht es aus, bei erfüllter Bedingung nur die Zelle entsprechend einzufärben. Da die Bedingung unabhängig der gerade zu zeichnenden Zelle immer abgefragt wird, ist als Endergebnis dann die ganze Datenzeile schweinchenrosa (oder wie auch immer) eingefärbt ;)
 
Zurück