Изменение цвета фона DataGridViewCell без потери фокуса - PullRequest
1 голос
/ 16 сентября 2009

В VB .Net 3.5 возможно ли изменить цвет DataGridViewCell (несвязанный) на другой цвет и визуально изменить ячейку, прежде чем потерять фокус или покинуть ячейку ? У меня есть таймер, который выполняет запросы с данными, и я бы хотел, чтобы цвета менялись сразу, а не после того, как пользователь покинул ячейку.

Я пробовал DataGridView.Refresh и Me.Refresh и не получил результатов.

Что я делаю не так? (Ниже приведен код, который я использую для изменения фона)

''' <summary>
''' Sets or clears the passed cells background to Red
''' </summary>
''' <param name="ColumnNumber">Datagridview column index of the cell to be changed</param>
''' <param name="RowNumber">Datagridview row index of the cell to be changed</param>
''' <param name="Error">Indicate whether the cell should be red, <c>True</c>, or empty, <c>False</c></param>
Private Sub Error_Cell(ByVal ColumnNumber As Integer, ByVal RowNumber As Integer, ByVal [Error] As Boolean)
    If [Error] Then
        Me.dgvMain.Rows(RowNumber).Cells(ColumnNumber).Style.BackColor = Color.Red
    Else
        Me.dgvMain.Rows(RowNumber).Cells(ColumnNumber).Style.BackColor = Color.Empty
    End If
    Me.dgvMain.Refresh()
    Me.Refresh()
End Sub

Ответы [ 2 ]

0 голосов
/ 03 октября 2009

Я решил, что нужно изменить только цвет фона текущих ячеек, и начал использовать EditControl DataGridViewCell.

Чтобы захватить это, мне пришлось захватить EditControl (Type DataGridViewTextBoxEditingContorl) в событии DataGridView «EditControlShowing» и связать EditControl ячеек с локальной переменной формы, а затем добавить обработчик в событие TextChagned (поскольку Cells TextChanged не происходит до завершения редактирования). (Первая процедура).

После этого я могу изменить цвет ячейки, изменив EditControls BackColor, который изменяется немедленно. (Вторая процедура)

Мне нужно освободить EditControl для события DataGridViews CellEndEdit, чтобы повторно использовать мою личную переменную. (Третья процедура)

Я не проверял попытки изменить строку из-за изменения в использовании, но, похоже, она работает нормально. Я надеюсь, что это помогает любому с подобной проблемой. Если есть более эффективные способы сделать это, пожалуйста, дайте мне знать!

Private EditingControl As DataGridViewTextBoxEditingControl

Private Sub dgvMain_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvMain.EditingControlShowing
    If TypeOf (e.Control) Is DataGridViewTextBoxEditingControl Then
        EditingControl = DirectCast(e.Control, DataGridViewTextBoxEditingControl)
        If DirectCast(e.Control, DataGridViewTextBoxEditingControl).EditingControlDataGridView.CurrentCell.OwningColumn Is PartNumber Then
            AddHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged
        End If
    End If
End Sub

Private Sub Error_Cell(ByVal [Error] As Boolean)
    If [Error] Then
        If EditingControl IsNot Nothing Then EditingControl.BackColor = Color.Red
    Else
        If EditingControl IsNot Nothing Then EditingControl.BackColor = Color.Empty
    End If
    Me.dgvMain.Refresh()
End Sub



Private Sub dgvMain_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvMain.CellEndEdit
    If EditingControl IsNot Nothing Then
        RemoveHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged
    End If

    EditingControl = Nothing

End Sub

Примечание: Множество шагов, которые у меня есть внутри If / Then, были удалены для защиты невинных, в противном случае они были бы встроены, когда это возможно.

0 голосов
/ 16 сентября 2009

Сначала вы должны объяснить, когда строка будет окрашена в другой цвет, например, в моем случае (когда пользователи нажимают на CheckBoxCell) Затем попробуйте использовать различные события, такие как CellLeave или CellContentClick (как мой пример): Наконец, играйте с кодом!

void updateCellStyle_DataGridViewCellEventArgs(object sender, DataGridViewCellEventArgs e){
int index = e.RowIndex;
if (index == -1)
 return;
else {
DataGridView dgv = sender as DataGridView;
int vCHK = e.ColumnIndex; //this is the checkbox column
if (vCHK != 0)
 return;
else {
 DataGridViewCheckBoxCell temp = (DataGridViewCheckBoxCell)dgv.Rows[index].Cells[0];
 if ((bool)temp.EditedFormattedValue == true) {
DataGridViewTextBoxCell xrow = (DataGridViewTextBoxCell)dgv.Rows[index].Cells[3];
xrow.OwningRow.DefaultCellStyle.BackColor = Color.Wheat;
 /*
 other operations 
 */
 }
 else {
 temp.OwningRow.DefaultCellStyle.BackColor = Color.White;
 /*
 other operations 
 */
 }
...