2017-02-14 7 views
0

Я борюсь со столбцом изображения в своем vb.net datagridview. Все, что я хочу сделать, это изменить изображение в зависимости от условного промежутка времени.vb.net datagridview image column (изменить изображение - условно)

Вот полный код:

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

Теперь, когда я открываю приложение, все изображения приходят только красный цвет.

Я добавил столбец name = "img", поэтому я получил изображения уже, но моя проблема в том, что все изображения не изменяются в зависимости от полученного значения даты, все изображения отображаются красным цветом.

Мой план состоял в том, чтобы иметь случай с временным интервалом менее 2 дней, чтобы появиться с зеленым изображением в качестве приемлемого периода обработки. Равно 2 = желтое изображение. Более 2 дней = красный.

У меня теперь есть красное изображение для всех строк, но его не изменяют в зависимости от оператора if, все строки имеют RED, поскольку я назначил его в столбце изображения.

Цель:

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

That's what appears to me now

Ясно, что не применяя оператор IF, есть что-то не так? Я что-то упускаю ?

Надеюсь, эта идея достаточно ясна.

Любая помощь будет оценена по достоинству. Спасибо!

+0

Вы не установили imgcol.name как «IMG» –

+0

а) событие cellFormatting или RowPrePaint событие было бы лучше чтобы установить изображение, а не циклически перемещаться по всем строкам. b) Большая проблема заключается в том, что вы создаете новый объект изображения для каждой строки. Если имеется 300 красных строк, вы создаете 300 красных изображений. В конечном итоге приложение закончится ресурсы – Plutonix

+0

Что вы имеете в виду из-за нехватки ресурсов? –

ответ

0

Предоставленный снимок не отображает значения для столбца ac_receiveddt. В любом случае, предполагая, что он содержит диапазон дат, и вы хотите отобразить цвет, основанный на различии. Попробуйте ниже. Используйте Days вместо 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 

Я добавил проверку для преобразования DateTime

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

Спасибо, я загрузил фотографию, которая также содержит полученную дату. Пробовал ваше решение, но никаких аффектов. Благодаря ! –

+0

@MohammedAbdulameer, вы уверены, что значение ячейки из ac_receiveddt преобразуется в DateTime, полученное правильно. Вы поставили точку останова и отладили ее.Я говорю это, потому что я попробовал это на своем ПК, и он работал изящно. Я обновил код, чтобы проверить его, он преобразует или нет. –

+0

Я использовал ваш код, те же результаты. –