2014-12-03 2 views
2

В проекте VB.NET WinForms я создаю в VS2013 у меня есть этот код, чтобы определить, когда содержимое ячейки а DataGridView был изменено:Как Сохранили Программный-Цветные фоны DataGridView на Сортировку

Private Sub dgvEmployees_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvEmployees.CellValueChanged 
    ' Pass the row and cell indexes to the method so we can change the color of the edited row 
    CompareDgvToDataSource("employees", e.RowIndex, e.ColumnIndex) 
End Sub 

Private Sub CompareDgvToDataSource(ByVal dataSetName As String, ByVal rowIndex As Integer, ByVal columnIndex As Integer) 
    ' Takes a dataset and the row and column indexes, checks if the row is different from the DataSet and colors the row appropriately 

    EmployeesBindingSource.EndEdit() 

    Dim dsChanges As DataSet = EmployeesDataSet.GetChanges() 

    If Not dsChanges Is Nothing Then 
     For Each dtrow As DataRow In dsChanges.Tables("employees").Rows 
      If DirectCast(dtrow, EmployeesDataSet.employeesRow).employeeID.ToString = dgvEmployees.Rows(rowIndex).Cells("employeeID").Value.ToString Then 
       For i As Integer = 0 To dsChanges.Tables("employees").Columns.Count - 1 

        If dtrow.RowState.ToString = DataRowState.Added.ToString Then 
         ' TODO: Color entire new row 
        ElseIf dsChanges.Tables(dataSetName).Rows(0).HasVersion(DataRowVersion.Original) Then 
         If Not dtrow(i, DataRowVersion.Current).Equals(dtrow(i, DataRowVersion.Original)) Then 
          Console.WriteLine("Employees ID: " & DirectCast(dtrow, EmployeesDataSet.employeesRow).employeeID) 
          dgvEmployees.Rows(rowIndex).Cells(columnIndex).Style.BackColor = Color.LightPink 
         Else 
          ' TODO: Need to change the BackColor back to what it should be based on its original alternating row color 
         End If 
        End If 
       Next 
      End If 
     Next 
    End If 
End Sub 

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

Что нужно сделать, чтобы сохранить цвет фона ячейки для правильной ячейки (я) после сортировки?

Final Рабочий код

Private Sub CompareDgvToDataSource() 

    ' Force ending Edit mode so the last edited value is committed 
    EmployeesBindingSource.EndEdit() 

    Dim dsChanged As DataSet = EmployeesDataSet.GetChanges(DataRowState.Added Or DataRowState.Modified) 

    If Not dsChanged Is Nothing Then 
     Dim dtChanged As DataTable = dsChanged.Tables("employees") 

     For Each row As DataRow In dtChanged.Rows 
      For Each dgvRow As DataGridViewRow In dgvEmployees.Rows 
       If dgvRow.Cells("employeeID").Value IsNot Nothing Then 
        If dgvRow.Cells("employeeID").Value.Equals(row.Item("employeeID")) Then 
         ' Found the row in the DGV that matches the current Changed Row 
         For i As Integer = 0 To dtChanged.Columns.Count - 1 

          If Not row(i, DataRowVersion.Current).Equals(row(i, DataRowVersion.Original)) Then 
           ' Found a Cell in the current DGV row that is different from the DataSet 
           Console.WriteLine("Row index: " & dtChanged.Rows.IndexOf(row)) 
           dgvEmployees.Rows(dgvRow.Index).Cells(i + 1).Style.BackColor = Color.LightPink 
          Else 
           ' Need to change the BackColor back to what it should be based on its original alternating row color 
          End If 
         Next 
        End If 
       End If 

      Next 
     Next 
    End If 
End Sub 
+0

Это может быть глупый вопрос, но вы не можете просто справиться с «Sorted» событие и добавить свой программный окраска там также? – Keith

ответ

2

I +1 к вашему вопросу, потому что это весело вызов :-)

Я не знал, что раскраска строки или ячейки будет быть потерянным после своего рода. Любопытно. Вот что я буду делать. Создайте переменную ViewState (или какой-либо другой объект/переменную, которая будет сохраняться), которая представляет собой массив целых чисел. Когда вы будете раскрашивать строку, объявите идентификатор этой строки вашей переменной.

Затем, в событии DataGridView.OnSorted, пропустите этот массив и перекрасьте каждую строку.

Информация о событии DataGridView.OnSorted здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.sorted(v=vs.110).aspx

Лемм знаю, если это имеет смысл, или если вам нужна дополнительная помощь.

EDIT:

Там может быть лучшим решением:

Windows Forms: DataGridView Problem with backgroundcolor after sorting

ДРУГОЙ EDIT:

Этот парень нашел творческое решение с использованием несвязанного DataGridView. По дизайну связанный DGV будет повторно привязываться при сортировке, и все изменения стиля будут потеряны. Но если вы используете несвязанный DGV, тогда все стили остаются после сортировки.

Прокрутите до конца, чтобы увидеть, как он ее решил.

https://social.msdn.microsoft.com/forums/windows/en-us/f7bde482-cc02-48be-b917-9fdfab73bc18/datagridview-rows-cells-state-not-retaining-after-sorting

Подробнее о Создание Освобожденный управления Windows Forms DataGridView:

http://msdn.microsoft.com/en-us/library/5s3ce6k8(v=vs.90).aspx

+0

Отличный материал, Кейси! Я удивлен, что не столкнулся с теми примерами, которые вы нашли, когда я искал. Я просмотрю этот материал и опубликую здесь свои результаты. – marky

+1

Я поселился в предложении в ответе на вопрос из вашей первой ссылки. Я использовал событие DataBindingComplete для вызова моего метода итерации через DataSet. Я выложу свой окончательный рабочий код. Благодаря! – marky

Смежные вопросы