2017-02-14 6 views
0

Ich habe Probleme mit Bildspalte in meinem vb.net datagridview. Alles, was ich tun möchte, ist das Bild abhängig von einer bedingten Zeitspanne zu ändern.vb.net datagridview Bildspalte (Bild ändern - bedingt)

Hier ist der vollständige Code:

con.Open() 
 
     da.SelectCommand = New OleDbCommand(Q, con) 
 
     da.Fill(ds) 
 
     da.Fill(dt) 
 
     DataGridView1.DataSource = dt 
 
     con.Close() 
 

 
     Dim receivedfrom As Date = Convert.ToDateTime(DateTimePicker1.Value) 
 
     Dim receivedto As Date = Convert.ToDateTime(DateTimePicker2.Value) 
 
     Dim difference As TimeSpan 
 
     Dim received As Date 
 
     Dim today As Date = today 
 
     Dim imgcol As New DataGridViewImageColumn() 
 
     Dim inImg As Image = My.Resources.red 
 
     imgcol.Image = inImg 
 
     DataGridView1.Columns.Add(imgcol) 
 
     imgcol.HeaderText = "" 
 
     imgcol.Name = "img" 
 
     imgcol.DataPropertyName = "img" 
 
     With DataGridView1 
 
      .Columns("img").DisplayIndex = 1 
 
      .Columns("img").Width = 28 
 
      .Columns("AC_RECEIVEDDT").DisplayIndex = 2 
 
     End With 
 

 

 
     For rowIndex = 0 To DataGridView1.RowCount - 1 
 
      received = DataGridView1.Rows(rowIndex).Cells("AC_RECEIVEDDT").Value 
 
      difference = today.Subtract(received) 
 

 
      If difference.Days < 2 Then 
 
       DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.green 
 
      ElseIf difference.Days = 2 Then 
 
       DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.yellow 
 
      Else 
 
       DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.red 
 
      End If 
 
     Next

Nun, wenn ich die Anwendung öffnen, werden alle Bilder in der roten Farbe kommen nur.

Ich habe die Spalte name = "img" hinzugefügt, deshalb habe ich die Bilder schon, aber mein Problem ist, dass alle Bilder nicht basierend auf dem empfangenen Datum geändert werden, alle Bilder werden rot angezeigt.

Mein Plan war es, den Fall mit einer Zeitspanne von weniger als 2 Tagen mit grünem Bild als akzeptable Bearbeitungszeit erscheinen zu lassen. Gleich 2 = gelbes Bild. Mehr als 2 Tage = rot.

Ich habe jetzt das rote Bild für alle Zeilen, aber es wird nicht basierend auf der if-Anweisung geändert, alle Zeilen haben ROT, wie ich es in der Bildspalte zugewiesen habe.

Ziel:

This is a DGV list with conditional status, that's exactly what i want to do

That's what appears to me now

ist klar, es ist nicht die IF-Anweisung angewendet wird, ist etwas nicht in Ordnung? Fehle ich etwas?

Hoffe, die Idee ist klar genug.

Jede Hilfe wäre willkommen. Danke!

+0

Du hast gesetzt imgcol.name nicht als „img‘ –

+0

a) Das Ereignis oder Cellformatting RowPrePaint Ereignis wäre ein besserer Ort sein Das Problem besteht darin, dass Sie ein neues Bildobjekt für jede Zeile erstellen.Wenn es 300 rote Zeilen gibt, erstellen Sie 300 rote Bilder. Schließlich wird die App leer sein Ressourcen – Plutonix

+0

Was meinst du damit, dass dir die Ressourcen ausgehen? –

Antwort

0

Der bereitgestellte Snapshot zeigt nicht die Werte für die Spalte ac_receiveddt. Unter der Annahme, dass es Datumsbereiche enthält und Sie die Farbe basierend auf dem Unterschied anzeigen möchten. Versuchen Sie es unten. Verwenden Sie Days anstelle von TotalDays.

If difference.Days < 2 Then 
    DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.Resource1.green 
ElseIf difference.Days = 2 Then 
    DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.Resource1.yellow 
End If 

Ich habe hinzugefügt Check für Datetime-Konvertierung

For rowIndex = 0 To DataGridView1.RowCount - 1 
Dim rValue = DataGridView1.Rows(rowIndex).Cells("AC_RECEIVEDDT").Value 
If DateTime.TryParse(rValue, received) Then 
    difference = today.Subtract(received) 

    If difference.Days < 2 Then 
     DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.green 
    ElseIf difference.Days = 2 Then 
     DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.yellow 
    Else 
     DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.red 
    End If 
Else 
    MessageBox.Show("not a DateTime") 
End If 
Next 

enter image description here

+0

Danke, ich habe ein Bild hochgeladen, das auch das eingegangene Datum enthält. Ihre Lösung versucht, aber keine Auswirkungen. Vielen Dank ! –

+0

@MohammedAbdulameer, Sind Sie sicher, dass der Zellenwert von ac_receiveddt korrekt in DateTime konvertiert wird? Hast du einen Bruchpunkt gesetzt und ihn ausgetestet?Ich sage das, weil ich es auf meinem PC ausprobiert habe und es anmutig funktioniert hat. Ich habe den Code aktualisiert, um zu testen, ob er konvertiert oder nicht. –

+0

Ich habe Ihren Code verwendet, die gleichen Ergebnisse. –

Verwandte Themen