2013-09-06 2 views
1

Атрибут таблицы 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

Я не знаю, является ли использование Link лучшим решением для вашей проблемы.

Вы должны сначала попытаться упростить код в событии DataGridView.CellFormatting. Некоторые способы: с-плюсом

  • Создать один частный случай регулярного и смелой Font, чтобы избежать создания экземпляра мультипликаторов в методе
  • Я думаю, что вам не нужно, чтобы проверить второе условие, если первый является прошло. Так If End If + If End If может быть заменен на If Else End If (не нужно, чтобы проверить два выражения)
  • Использование If x AndAlso y Then вместо If x And y Then: если первое выражение ложно, то второй не будет протестирован
  • я не понять цель этого If e.RowIndex <= DataSet1.Tables("dtArticles").Rows.Count - 1 Then.Если цель не проверить, если строка является NewRowAllowUserToAddRows имущества установлен в True), проще будет это

    If DataGridView1.Rows(e.RowIndex).IsNewRow then 
    

Private _RegularFont As New Font("Microsoft Sans Sherif", 8, FontStyle.Regular) 
Private _BoldFont As New Font("Microsoft Sans Sherif", 8, FontStyle.Bold) 

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 Not dgvArticles.Rows(e.RowIndex).IsNewRow Then 
      drv = View.Item(e.RowIndex) 

      '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 = _BoldFont 
      Else 'First condition tested, test second 

       '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" AndAlso 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 = _RegularFont 
        End If 
       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 
       Dim c As Color 
       c = Color.LightSalmon 
       e.CellStyle.BackColor = c 
      End If 
     End If 
    End If 
End Sub 

Используя ссылку, вы мог бы сделать что-то подобное (для вашей цели вам не следует перебирать DataView.Rows для получения индекса, но непосредственно в DataGridView.Rows):

Dim _BoldFont As New Font("Microsoft Sans Sherif", 8, FontStyle.Regular) 

Dim q = From r In Me.DataGridView1.Rows 
     Where CType(r, DataGridViewRow).Cells("Standard").Value.ToString = "Oui" 
     Select r 
For Each item In q 
     CType(item, DataGridViewRow).DefaultCellStyle.Font = _BoldFont 
Next 

Dim q = From r In Me.DataGridView1.Rows 
     Where CType(r, DataGridViewRow).Cells("Available").Value.ToString = "Non" 
     Select r 
For Each item In q 
     CType(item, DataGridViewRow).DefaultCellStyle.BackColor = Color.LightSalmon 
Next 
+0

Спасибо за ответ. Я понял что-то довольно тревожное. Выделение строки занимает гораздо больше времени, чем изменение цвета строки. Поэтому я немного переключил его и начал использовать цвета строк (1 жирный ряд занимает около 0,3 секунды ... это довольно много). Кроме того, когда я просматриваю свой DataView, он уже находится в памяти, что делает его быстрее, чем форматирование ячеек DataGridView. В любом случае, код, вставленный для форматирования ячейки, был получен с другого сайта, и я не создал его полностью. Еще раз спасибо за ответ - оценили. – Alex

+0

@Alex Добро пожаловать. Я забыл вставить шрифт в свой код - Исправлено. Что-то меняет? – Chris

+0

Я протестировал ваше решение, и оно немного быстрее (примерно 20 миллисекунд в среднем), чем мое предыдущее форматирование ячейки. Хотя решение DataView почти на 1 секунду быстрее. Сначала мне захотелось использовать LINQ, чтобы избежать повторного итерации через DataView ... Но я пока не знаю, как это сделать. Если я это выясню, я отправлю ответ. Спасибо Chris – Alex