Laden...

WinForms - Zelle in DGV farbig wenn bestimmtes Datum angezeigt wird

Letzter Beitrag vor 8 Jahren 11 Posts 2.660 Views
WinForms - Zelle in DGV farbig wenn bestimmtes Datum angezeigt wird

Hallo zusammen,

ich habe eine Windows Form (Form1) in der ich in ein DataGridView, Daten aus einer Access - Datenbank lade, sobald die Form geöffnet wird.
In einer der Spalten steht ein Datum(Ablaufdatum). Es gibt mehrere Zeilen in dem DGV. Ich möchte jetzt folgende farbige Formatierung der jeweiligen Zelle und Zeile:

  1. Wenn nur noch 30 Tage bis zum dem Datum sind, soll die Zelle gelb hinterlegt werden.

  2. Wenn das Datum erreicht oder überschritten ist, soll die Zelle rot hinterlegt werden.

  3. Ansonsten soll die Zelle immer grün sein

Ich habe jetzt schon mehrere Tage im Internet gesucht und keine passende Lösung gefunden. Ich hoffe Ihr könnt mir hier weiterhelfen.

Viele Dank schon mal im Vorraus

Hallo,

wo genau kommst du nicht weiter?
Geht es um die "Datumsdifferenz"?
Weißt du nicht wie du die Hintergrundfarbe in deinem DGV änderst?
Oder etwas anderes?

Auf die Schnelle könnte dir vielleicht das helfen?
https://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcellstyle.backcolor%28v=vs.110%29.aspx

@knipser:
Dann schau doch mal beim DataGridView die möglichen Ereignisse durch ( Doku!!).
Was könnte da zum **formatieren **einer **Zelle **wohl benutzt werden?
https://msdn.microsoft.com/de-de/library/system.windows.forms.datagridview.cellformatting(v=vs.110).aspx

Hoffentlich versucht er jetzt nicht:

format fzelle 😉 😉

Ich weiß wir Anfänger sollen in die Doku gucken, das ist wichtig.
Aber manchmal weiß man einfach nicht wo man anfangen soll und es war sein erster Beitrag hier.

@ TE: Bestimmt führen dich die Tipps und evtl. noch das hier https://msdn.microsoft.com/en-us/library/xhtyw595%28v=vs.84%29.aspx zum Ziel.

Sonst einfach nochmal eine konkretere Fragen posten 🙂

edit: Vergiss meinen Link der ist VBScript.

Danke schonmal für die Hilfe. 🙂

Die Zellformatierung würde ich mit CellStyle.Backcolor machen. soweit wäre es kein Problem.

nur mit den Bedingungen komme ich nicht weiter. Es soll ja nur formatiert werden, wenn das ein bestimmtes Datum erreicht ist.

vielleicht hat ja jemand einen Lösungsansatz mit einem Beispiel - Code. das würde mir, denke ich zumindest, weiterhelfen 🙂

@Buchstabensuppe: es geht, wie du schon vermutet hast, um die Differenz zwischen den jeweiligen Datum.

Hallo knipser,

neeeeee, ich bin mir sicher, das bekommst du auch so hin. 🙂 Was hindert dich daran das Datum auszulesen und ggn ein anderes Datum zu prüfen? In den gegebenen Links von FZelle steht, wie man den Value ausliest. Sogar mit Code. Alles was du tun musst ist lesen, kopieren und ein wenig if/else...das bekommst du schon hin 😉

Gruss

Coffeebean

Hallo nochmal,

@coffeebean: ich habe deinen Rat befolgt und die letzten 3 Tage versucht es allein hinzubekommen. leider ohne Erfolg. auch den Link von FZelle hatte ich bereits vor längeren schon offen. Auch hier ohne Erfolg.

Mein Problem ist, das ich bei dem Auslesen nicht weiter kommen. Ich versuche es mal auf Deutsch darzustellen:

wenn im DGV in Spalte1 das Datum = Heute + 30 Tage, dann soll es gelb werden
(innerhalb der 30 Tage soll es weiterhin gelb hinterlegt bleiben!)

wenn im DGV in Spalte1 das Datum ≤ heute, dann soll es rot werden
(es soll dann auch immer rot bleiben, was ja durch das < Zeichen auch gewährleistet sein sollte)

ansonsten soll es immer grün hinterlegt sein.

Und hier liegt jetzt das Problem. Ich komme einfach nicht weiter, um eine Schleife für alle Zeilen zu erstellen, die das oben stehende dann abfragt.

Wäre wirklich Super wenn mir hier einer weiterhelfen könnte.
Ein Codebeispiel um mich auf den richtigen Weg zu bringen, wäre super.

Vielen Dank Euch allen

Hallo knipser,

was hast du denn bisher probiert? Kannst du uns Code geben, anhand dem wir dir helfen können?

Btw: Hast du den Link mal gelesen? Da steht

The E:System.Windows.Forms.DataGridView.CellFormatting event occurs every time each cell is painted [...]

Du brauchst also keine Schleife um über die Zeilen zu iterieren. Das Event, was FZelle gepostet hat, wird automatisch geschmissen.

Findest du auch mit dem [Artikel] Debugger: Wie verwende ich den von Visual Studio? raus.

Gruss

Coffeebean

[Hinweis] Wie poste ich richtig? Punkt 4, ich weiß, ich sollte nicht darauf einsteigen, aber manchmal kann man einfach nicht mehr zugucken 😉

  • Markier dein DataGridView
  • F4 öffnet das Eigenschaftenfenster
  • Klick auf den Blitz im Eigenschaftenfenster (oben, Mitte rechts)
  • such die Zeile mit dem Ereignis "CellFormatting" (siehe Screenshot) und doppelklick das leere Feld in der rechten Spalte
    Du landest im Code-Behind, das sollte etwa so aussehen:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{

}

Hier arbeitest du weiter:


private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    var myDataGrid = sender as DataGridView;           //sag dem Compiler, dass es sich um ein DGV handelt
    var myColumn = myDataGrid.Columns[e.ColumnIndex]; //finde heraus, in welcher Spalte du bist

    if (myColumn.Name == "Datumsspaltenname") //alle anderen Spalten interessieren dich ja nicht
    {
        var dateInField = ((DateTime)e.Value).Date; //.Date, damit wir nicht die Uhrzeiten vergleichen
        var compareDate = DateTime.Now.Date;
        if(compareDatum größer als dateInField)...
        else if(compareDatum kleiner als dateInField+30 tage)...
        else ...
        //Hintergrundfarbe der Zelle findest du in e.CellStyle.BackColor
     }
}

Tut mir ja leid, das so zu sagen, aber du vermittelst nicht wirklich den Eindruck, als hättest du die Links und Hinweise bisher befolgt, obwohl die die Lösung quasi schon vorweggenommen haben. Ein bisschen mehr Eigeninitiative wäre gut. Oder, wenn dich das wirklich überfordert hat, wäre das ein Zeichen dafür, dass du dich noch etwas mehr mit den Grundlagen beschäftigen solltest.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Hi,

das Thema ist zwar schon ein paar Tage alt aber vielleicht hilft dir das ja noch.

  1. Erstelle für dein DataGridView ein Ereigniss für "RowPrePaint"


private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    DateTime tmpDateWv = Convert.ToDateTime(DataGridView1["DataGridViewTextBoxColumn", e.RowIndex].Value);
    DateTime tmpDateToday = DateTime.Today;
    if (tmpDateWv < tmpDateToday.AddDays(-5))
    {
        DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFC7CE"); // rot
    }
    else
    {
        DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFEB9C"); // gelb
    }
}

Ist jetzt ein Beispiel aus meinem Projekt, sollte aber ohne Probleme auf deine Bedürfnisse anpassbar sein.

Hallo SeriouslyNot,

vielen Dank, das ist genau der Denkanstoß den ich gesucht habe. Vielen Dank dafür. Den Rest bekomme ich jetzt allein hin 😃