Стиль DataGridViewCell не обновляется вовремя

Я пишу C# приложение (окна формы), в котором у меня есть 10x10 DataGridView, который представляет лабиринт. При щелчке по ячейке я добавляю соответствующие x и y в двумерный массив. Каждая ячейка, по которой щелкают, должна отображать черный фон.

На CellClick:

        int row = dataGridView1.CurrentCell.RowIndex;
        int column = dataGridView1.CurrentCell.ColumnIndex;

        maze[row, column] = 1;

        dataGridView1.Refresh();

Я также реализовал обработчик для события CellFormatting:

if (maze[e.RowIndex,e.ColumnIndex] == 1){
       e.CellStyle.BackColor = Color.Black;
   }

Теперь, когда я щелкаю ячейку, стиль не обновляется. Когда я щелкаю другую ячейку после этого, стиль предыдущей ячейки обновляется. Я пытался оба Refresh() а также Update контроль, но не повезло.

Как я могу решить эту проблему, чтобы стиль ячейки немедленно обновлялся при нажатии?

2 ответа

Решение

Вы можете использовать эти события, чтобы нарисовать текущую ячейку по клику или клавише вниз:

Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

    'put here your code to add CurrentCell to maze array

    Me.PaintCurrentCell()

End Sub

Private Sub DataGridView1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

    If e.KeyCode = Keys.Space Then Me.PaintCurrentCell()

End Sub

Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged

    Me.DataGridView1.CurrentCell.Style.SelectionBackColor = Me.DataGridView1.CurrentCell.Style.BackColor

End Sub

Private Sub PaintCurrentCell()

    Me.DataGridView1.CurrentCell.Style.BackColor = Color.Black
    Me.DataGridView1.CurrentCell.Style.SelectionBackColor = Color.Black

End Sub

Что происходит, когда вы щелкаете ячейку, вы вызываете событие форматирования ячейки. Когда вы выходите из клетки, вы звоните снова. Вот почему он обновляется после нажатия на него. Чтобы принудительно вызвать CellFormattingEvent для всех ячеек, вы можете вызвать следующее:

DataGridView1.Invalidate()
Другие вопросы по тегам