При копировании в файл класса объекта маршрута обнаруживается это
#File: vendor/symfony/routing/Route.php
public function setOptions(array $options)
{
$this->options = array(
'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler',
);
return $this->addOptions($options);
}
То есть - Symfony устанавливает поле compiler_class
в массиве опций, и именно этот массив опций является ключом конфигурации options:
связано с. Затем Symfony использует эту опцию класса компилятора в том же классе
#File: vendor/symfony/routing/Route.php
public function compile()
{
if (null !== $this->compiled) {
return $this->compiled;
}
$class = $this->getOption('compiler_class');
return $this->compiled = $class::compile($this);
}
Так что - вероятно, не то, что 99% разработчиков Symfony понадобится / захочет использовать, но оно все еще там.
Правильный подход - переопределение события SelectionChanged. Свойство CurrentCell можно использовать для установки текущей ячейки. Вам нужно что-то вроде этого:
private void dataGridView_SelectionChanged(object sender, EventArgs e)
{
DataGridViewCell currentCell = dataGridView.CurrentCell;
if (currentCell != null)
{
int nextRow = currentCell.RowIndex;
int nextCol = currentCell.ColumnIndex + 1;
if (nextCol == dataGridView.ColumnCount)
{
nextCol = 0;
nextRow++;
}
if (nextRow == dataGridView.RowCount)
{
nextRow = 0;
}
DataGridViewCell nextCell = dataGridView.Rows[nextRow].Cells[nextCol];
if (nextCell != null && nextCell.Visible)
{
dataGridView.CurrentCell = nextCell;
}
}
}
Вам нужно будет добавить тест для текущей ячейки, доступной только для чтения, и выполнить цикл, пока следующая ячейка невидима или доступна только для чтения. Вам также нужно будет убедиться, что вы никогда не зацикливаетесь, если все ячейки доступны только для чтения.
Вам придется иметь дело со случаем, когда индекс отображения также отличается от базового индекса.
Чтобы добиться такого поведения при нажатии Tab, вам нужно добавить обработчик KeyDown:
private void AlbumChecker_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
SelectNextEditableCell(DataGridView dataGridView);
}
}
и поместить первый код в этот новый метод.
Возможно, вы захотите проверить, что DataGridView тоже имеет фокус.
Inherit DataGridView и переопределение ProcessDialogKey (для клавиши, нажатой во время редактирования) и ProcessDataGridViewKey (для клавиши, нажатой, когда не редактируется). Когда нажата вкладка, установите CurrentCell для следующей ячейки, не предназначенной только для чтения.
При желании можно переопределить WndProc для фильтрации щелчков мыши по ячейкам, доступным только для чтения. (См. DataGridView.GetColumnDisplayRectangle, чтобы найти столбец, по которому щелкнули).
Хороший источник для начала с здесь .
When the cell is in edit mode, and you want to listen to keystroke events, you might try handling the DataGridView's EditingControlShowing event...
Private Sub myDvGrid_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles myDvGrid.EditingControlShowing
Dim c As DataGridViewTextBoxEditingControl = DirectCast(e.Control, DataGridViewTextBoxEditingControl)
RemoveHandler c.PreviewKeyDown, AddressOf edtctrlOn_PreviewKeyDown
RemoveHandler c.TextChanged, AddressOf edtctrlOn_TextChanged
AddHandler c.TextChanged, AddressOf edtctrlOn_TextChanged
AddHandler c.PreviewKeyDown, AddressOf edtctrlOn_PreviewKeyDown
End Sub
Then, in the edtctrlOn_PreviewKeyDown event, you can bubble the arguments over to the original datagrid's PreviewKeyDown event handler.