Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WinForms - Zelle in DGV farbig wenn bestimmtes Datum angezeigt wird
knipser
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

WinForms - Zelle in DGV farbig wenn bestimmtes Datum angezeigt wird

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Buchstabensuppe
myCSharp.de - Member



Dabei seit:
Beiträge: 88

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.006

beantworten | zitieren | melden

@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
private Nachricht | Beiträge des Benutzers
Buchstabensuppe
myCSharp.de - Member



Dabei seit:
Beiträge: 88

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Buchstabensuppe am .
private Nachricht | Beiträge des Benutzers
knipser
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.209
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
knipser
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.209
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
Zitat
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
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

[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
Attachments
"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)
private Nachricht | Beiträge des Benutzers
SeriouslyNot
myCSharp.de - Member



Dabei seit:
Beiträge: 13

beantworten | zitieren | melden

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"

2.


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.
private Nachricht | Beiträge des Benutzers
knipser
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Hallo SeriouslyNot,

vielen Dank, das ist genau der Denkanstoß den ich gesucht habe. Vielen Dank dafür. Den Rest bekomme ich jetzt allein hin :-)
private Nachricht | Beiträge des Benutzers