Обойдите ячейки только для чтения в DataGridView при нажатии клавиши TAB

При копировании в файл класса объекта маршрута обнаруживается это

#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 понадобится / захочет использовать, но оно все еще там.

8
задан Cornel 15 April 2009 в 14:32
поделиться

3 ответа

Правильный подход - переопределение события 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 тоже имеет фокус.

5
ответ дан 5 December 2019 в 08:25
поделиться

Inherit DataGridView и переопределение ProcessDialogKey (для клавиши, нажатой во время редактирования) и ProcessDataGridViewKey (для клавиши, нажатой, когда не редактируется). Когда нажата вкладка, установите CurrentCell для следующей ячейки, не предназначенной только для чтения.

При желании можно переопределить WndProc для фильтрации щелчков мыши по ячейкам, доступным только для чтения. (См. DataGridView.GetColumnDisplayRectangle, чтобы найти столбец, по которому щелкнули).

Хороший источник для начала с здесь .

0
ответ дан 5 December 2019 в 08:25
поделиться

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.

0
ответ дан 5 December 2019 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: