Sree1981 Ответов: 1

Повторение одного и того же кода


Я пишу следующий код после каждой фильтрации Dataview. Как избежать этого повторения кода?

For i As Integer = 0 To datagridview1.Rows.Count - 1
            If (datagridview1.Rows(i).Cells("Completion Date").Value <= Date.Today) And (datagridview1.Rows(i).Cells("Status").Value = "Ongoing") Then
                datagridview1.Rows(i).Cells("Completion Date").Style.BackColor = Color.Red
            ElseIf (DateDiff(DateInterval.Day, Date.Today, datagridview1.Rows(i).Cells("Completion Date").Value) <= 20) And (datagridview1.Rows(i).Cells("Status").Value = "Ongoing") Then
                datagridview1.Rows(i).Cells("Completion Date").Style.BackColor = Color.Aqua
            End If
        Next


Что я уже пробовал:

Module Module1
    Public datagridview1 As DataGridView
    Sub Gridviewcolor()

        For i As Integer = 0 To datagridview1.Rows.Count - 1
            If (datagridview1.Rows(i).Cells("Completion Date").Value <= Date.Today) And (datagridview1.Rows(i).Cells("Status").Value = "Ongoing") Then
                datagridview1.Rows(i).Cells("Completion Date").Style.BackColor = Color.Red
            ElseIf (DateDiff(DateInterval.Day, Date.Today, datagridview1.Rows(i).Cells("Completion Date").Value) <= 20) And (datagridview1.Rows(i).Cells("Status").Value = "Ongoing") Then
                datagridview1.Rows(i).Cells("Completion Date").Style.BackColor = Color.Aqua
            End If
        Next

    End Sub
End Module

1 Ответов

Рейтинг:
0

OriginalGriff

Переместите его в событие CellPainting: Раскрашивание ячеек DataGridView в соответствии с их содержимым в WinForms[^] - код написан на C#, но он довольно прост, и те же действия выполняются в VB. Онлайн-переводчики могут помочь, если вы можете;t решить это для себя: Преобразователь кода C# в VB и VB в C# – Telerik[^]


Maciej Los

5ed!

Sree1981

Спасибо за ваш ответ.Но мне это не удалось.Во-первых, это не соответствует моей концепции.Мне нужно проверить значения одного столбца на основе значения в другом столбце.Поэтому я заменил его своим кодом, но когда я вызываю его с помощью dgvData_CellPainting (), он показывает ошибку.

OriginalGriff

И не видя вашего кода или не зная, в чем ошибка, что вы ожидаете от нас сделать?

Sree1981

Я поместил следующий код в форму, которая имеет datagridview1

Sub Gridviewcolor(datagridview1 как DataGridView)
For i As Integer = 0 To datagridview1.Rows.Количество - 1
If (datagridview1.Rows(i).Ячейки("Дата Завершения").Значение <= дата.Сегодня) И (datagridview1.Rows(i).Ячейки("Статус").Значение = "Продолжается") Затем
datagridview1.Ряды(я).Ячейки("Дата Завершения").Стиль.Цвет Фона = Цвет.Красный
ElseIf (DateDiff(DateInterval.День, Дата.Сегодня datagridview1.Rows(i).Ячейки("Дата Завершения").Значение) <= 20) и (datagridview1.Rows(i).Ячейки("Статус").Значение = "Продолжается") Затем
datagridview1.Ряды(я).Ячейки("Дата Завершения").Стиль.Цвет Фона = Цвет.Аква
Конец, Если
Следующий
Конец Подводной Лодки

и я назвал это с помощью Gridviewcolor(DataGridView1)
он работает, но кто-то сказал, что это неправильно.

Sree1981

Я поместил свой код в событие cellpainting datagridview1 следующим образом.Это работает, но правильно ли это?

Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) обрабатывает DataGridView1.CellPainting
For i As Integer = 0 To DataGridView1.Rows.Количество - 1
If (DataGridView1.Rows(i).Ячейки("Дата Завершения").Значение <= дата.Сегодня) И ((DataGridView1.Rows(i).Ячейки("Статус").Value = "continuing") или (DataGridView1.Rows(i).Ячейки("Статус").Значение = "Hold")) Затем
DataGridView1.Rows(i).Ячейки("Дата Завершения").Стиль.Цвет Фона = Цвет.Красный
ElseIf (DateDiff(DateInterval.День, Дата.Сегодня DataGridView1.Rows(i).Ячейки("Дата Завершения").Значение) <= 20) и ((DataGridView1.Rows(i).Ячейки("Статус").Value = "continuing") или (DataGridView1.Rows(i).Ячейки("Статус").Значение = "Hold")) Затем
DataGridView1.Rows(i).Ячейки("Дата Завершения").Стиль.Цвет Фона = Цвет.Аква
Конец, Если
Следующий
Конец Подводной Лодки

OriginalGriff

Нет. Даже близко нет.
Как вы думаете, для чего существует событие CellPainting? Как вы думаете, когда это называется? Подсказка: подумайте о названии события ...

Sree1981

На самом деле я не знаю, что я новичок.

OriginalGriff

Ну, вы проверили документацию?
Когда, по-вашему, его можно было бы назвать таким именем?

Sree1981

Да, это так. Я заменил dgvData_CellPainting (в статье, на которую вы ссылались) на DataGridView1_CellPainting, думая, что dgvData-это имя Datagridview.

OriginalGriff

Нет, как вы думаете, когда система вызывает метод обработчика для события под названием CellPainting?

Это:
1) Когда форма впервые построена?
2) Когда будет построен DGV?
3) когда мышь проходит над ним?
4) Когда пользователь нажимает на определенную ячейку?
5) другие?

Как вы думаете, и почему?

Sree1981

Изначально, я думал, что это была процедура. Я попробовал таким образом, но не было никакого кода для вызова процедуры.
Затем в соответствии с инструкцией "просто подключите обработчик событий CellPainting к вашему DataGridView" я помещаю свой код в событие Cellpainting.

OriginalGriff

На нем написано "долгий день"...

События: вы ведь знаете, что это такое, да?
Когда вы нажимаете кнопку, система вызывает событие Click, которое проверяет конкретную коллекцию обработчиков кнопок и по очереди вызывает каждый метод обработчика в цепочке.
Чтобы "подключить обработчик", проще всего дважды щелкнуть событие на панели событий панели объектов в Visual studio (найдите световой болт чуть выше списка свойств).
Ваш метод будет вызван, когда произойдет событие.

В этом случае вам нужно найти событие CellPainting в списке и добавить код в обработчик.
Но только не этот код. Этот код представляет собой цикл, и это не обязательно в событии CellPainting, потому что ... ну, вы мне скажите: для чего вызывается обработчик событий CellPainting? Что заставляет систему вызывать событие?

Sree1981

Я прочитал следующее...
Событие CellPainting вызывается всякий раз, когда ячейка нуждается в перекраске. Это может быть вызвано необходимостью перерисовки ячейки, поскольку она была признана недействительной, закрыта другим окном, изменением источника данных, изменением значения ячейки, появлением ячейки в поле зрения после прокрутки и т. д

OriginalGriff

Да, именно так.
Так почему же вы хотите поместить туда петлю, чтобы посмотреть на другие строки?

Sree1981

Надеюсь, на этот раз я на правильном пути.Но невозможно ограничить окраску только тогда, когда значение столбца "статус" равно "продолжается"или "удерживается".
Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) обрабатывает DataGridView1.CellPainting

Дим dgv как практическое руководство = TryCast(отправитель, практическое руководство)
Если dgv не является ничем и также e.RowIndex >= 0, то
Если e.ColumnIndex = dgv.Columns("дата завершения").Тогда Индекс
Тусклый c как цвет
Если e.Value-это не Ничто, то
Дим значение как дата = функция cdate(электронная.Значение)
Если значение < сегодня, то
с = Цвет.Красный
Ключевые Слова Elseif Функция Datediff(Для Dateinterval.День, Дата.Сегодня, значение) <= 25 тогда
с = Цвет.Аква
Еще
с = dgv.DefaultCellStyle.Задний цвет
Конец, Если
е.CellStyle.BackColor = c
Конец, Если
Конец, Если
Конец, Если
Конец Подводной Лодки

Sree1981

У меня работает следующий код.Правильно ли это?
Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) обрабатывает DataGridView1.CellPainting

Дим dgv как практическое руководство = TryCast(отправитель, практическое руководство)
Если dgv не является ничем и также e.RowIndex >= 0, то
Если e.ColumnIndex = dgv.Columns("дата завершения").Тогда Индекс
Тусклый c как цвет
Если e.Value-это не Ничто, то
Дим значение как дата = функция cdate(электронная.Значение)
Если значение &ЛТ; сегодня атакже dgv.Строк(электронная.Параметр rowindex).Ячейки("Статус").Ценность.ToString = "текущий" или dgv.Rows(e.Параметр rowindex).Ячейки("Статус").Ценность.ToString = "Hold", То
с = Цвет.Красный
Ключевые Слова Elseif Функция Datediff(Для Dateinterval.День, Дата.Today, value) <= 25 AndAlso dgv.Rows(e.Параметр rowindex).Ячейки("Статус").Ценность.ToString = "текущий" или dgv.Rows(e.Параметр rowindex).Ячейки("Статус").Ценность.ToString = "Hold", То
с = Цвет.Аква
Еще
с = dgv.DefaultCellStyle.Задний цвет
Конец, Если
е.CellStyle.BackColor = c
Конец, Если
Конец, Если
Конец, Если

OriginalGriff

Выглядит намного лучше!

Sree1981

Я знаю, что я не эксперт и не могу предложить идеальное решение.Пожалуйста, посоветуйте сделать его идеальным.Я знаю, что вы уже потратили на это свое драгоценное время..Спасибо...

OriginalGriff

Оставь его в покое!
В компьютерах есть Максима: "если это не сбой, не исправляйте его."

Вместо этого вернитесь и посмотрите на него через шесть месяцев и посмотрите, что еще опыт говорит вам о том, что вы произвели.