Атрибут таблицы DataView присвоен одному из моих данных. DataView затем устанавливается как DataSource DataGridView. Вроде так:Извлечение индекса строки из DataView с использованием LINQ
View.Table = DataSet1.Tables("dtArticles")
dgvArticles.DataSource = View
Моя цель - выполнить некоторое форматирование по некоторым заданным строкам. К сожалению, единственный способ, которым я нашел это, - использовать событие CellFormatting. Это довольно долго, поскольку оно должно проходить через каждую строку и проверять, требуется ли строке для форматирования (полужирный шрифт, обратная сторона).
CellFormatting
Private Sub dgvArticles_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvArticles.CellFormatting
Dim drv As DataRowView
If e.RowIndex >= 0 Then
If e.RowIndex <= DataSet1.Tables("dtArticles").Rows.Count - 1 Then
drv = View.Item(e.RowIndex)
Dim c As Color
'Bolds if it is standard, makes it regular if it's not standard and already bold
If drv.Item("Standard").ToString = "Yes" Then
dgvArticles.Rows(e.RowIndex).DefaultCellStyle.Font = New Font("Microsoft Sans Sherif", 8, FontStyle.Bold)
End If
'Test if Standard is "No" and if the row is currently bold, if it is, put it back to regular
If drv.Item("Standard").ToString = "No" And Not dgvArticles.Rows(e.RowIndex).DefaultCellStyle.Font Is Nothing Then
If dgvArticles.Rows(e.RowIndex).DefaultCellStyle.Font.Bold Then
dgvArticles.Rows(e.RowIndex).DefaultCellStyle.Font = New Font("Microsoft Sans Sherif", 8, FontStyle.Regular)
End If
End If
'Puts a red color to the rows who are not available
If drv.Item("Available").ToString = "No" Then
'Change back color
c = Color.LightSalmon
e.CellStyle.BackColor = c
End If
End If
End If
End Sub
Что это делает для клеток каждой строки добавляется в DataGridView; он проверяет, соответствует ли текущее значение текущего столбца Standard
«Да» или «Нет». В зависимости от результата он выделяет жирным шрифтом/нежирным шрифтом. Тот же самый принцип относится к моей колонке Available
. Если значение «Доступно» равно «Нет», тогда я поставлю светло-красный цвет назад в строку. Это событие возникает многократно (10 000 статей с DataTable из 10 или около того).
Около 2,2-2,7 секунд на среднем
Итерация через DataView
Dim i As Integer = 0
For Each dt As BillMat.dtArticlesRow In View.Table.Rows
If dt.Standard = "Oui" Then dgvArticles.Rows(i).DefaultCellStyle.Font = New Font("Microsoft Sans Sherif", 8, FontStyle.Bold)
If dt.Available = "Non" Then dgvArticles.Rows(i).DefaultCellStyle.BackColor = Color.LightSalmon
i += 1
Next
О 1,5-1,7 секунды в среднем
Можно ли использовать LINQ для выбора RowIndex, из которых столбец Standard
равен «Да», а столбцов Available
равен «Нет»? Если это так, не использовал бы индекс для применения форматирования намного быстрее, чем повторять все 10 000 статей?
Спасибо за ответ. Я понял что-то довольно тревожное. Выделение строки занимает гораздо больше времени, чем изменение цвета строки. Поэтому я немного переключил его и начал использовать цвета строк (1 жирный ряд занимает около 0,3 секунды ... это довольно много). Кроме того, когда я просматриваю свой DataView, он уже находится в памяти, что делает его быстрее, чем форматирование ячеек DataGridView. В любом случае, код, вставленный для форматирования ячейки, был получен с другого сайта, и я не создал его полностью. Еще раз спасибо за ответ - оценили. – Alex
@Alex Добро пожаловать. Я забыл вставить шрифт в свой код - Исправлено. Что-то меняет? – Chris
Я протестировал ваше решение, и оно немного быстрее (примерно 20 миллисекунд в среднем), чем мое предыдущее форматирование ячейки. Хотя решение DataView почти на 1 секунду быстрее. Сначала мне захотелось использовать LINQ, чтобы избежать повторного итерации через DataView ... Но я пока не знаю, как это сделать. Если я это выясню, я отправлю ответ. Спасибо Chris – Alex