Стиль 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()