Пусть только несколько символов вводятся в ячейку таблицы данных - PullRequest
5 голосов
/ 16 апреля 2011

Есть ли способ разрешить добавление только определенных символов в ячейку просмотра данных? как '1234567890'?

Ответы [ 2 ]

4 голосов
/ 16 апреля 2011

Мне известны два подхода, которые вы можете использовать для этого. Первое (и я думаю, что лучше всего) - использовать событие CellValidating на DataGridView и проверить, является ли введенный текст числовым.

Вот пример того, что также устанавливает значение ошибки строки (с дополнительным обработчиком событий CellEndEdit, который пользователь отменяет из-за редактирования).

private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        string headerText = 
            dataGridView1.Columns[e.ColumnIndex].HeaderText;

        // Abort validation if cell is not in the Age column.
        if (!headerText.Equals("Age")) return;

        int output;

        // Confirm that the cell is an integer.
        if (!int.TryParse(e.FormattedValue.ToString(), out output))
        {
            dataGridView1.Rows[e.RowIndex].ErrorText =
                "Age must be numeric";
            e.Cancel = true;
        }

    }

    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        // Clear the row error in case the user presses ESC.   
        dataGridView1.Rows[e.RowIndex].ErrorText = String.Empty;
    }

Второй подход заключается в использовании события EditingControlShowing и присоединении события к KeyPress ячейки - я не такой фанат этого подхода, поскольку он молча блокирует ввод нецифровых ключей - хотя я полагаю, вы могли бы дать некоторые обратная связь (как звон колокольчика) это просто похоже на большую работу по сравнению с другим способом.

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    e.Control.KeyPress -= TextboxNumeric_KeyPress;
    if ((int)(((System.Windows.Forms.DataGridView)(sender)).CurrentCell.ColumnIndex) == 1)
    {
         e.Control.KeyPress += TextboxNumeric_KeyPress;
    }
}

private void TextboxNumeric_KeyPress(object sender, KeyPressEventArgs e)
{
    bool nonNumberEntered = true;

    if ((e.KeyChar >= 48 && e.KeyChar <= 57) || e.KeyChar == 8)
    {
        nonNumberEntered = false;
    }

    if (nonNumberEntered)
     {
        // Stop the character from being entered into the control since it is non-numerical.
        e.Handled = true;
    }
    else
    {
        e.Handled = false;
    }
}

Одно важное замечание, касающееся этого, - будьте осторожны, чтобы удалить обработчик событий в элементе управления в методе отображения элемента редактирования. Это важно, поскольку DataGridView повторно использует один и тот же объект для каждой ячейки одного и того же типа, в том числе в разных столбцах. Если вы прикрепите обработчик событий к элементу управления в одном столбце текстового поля, все остальные ячейки текстового поля в сетке будут иметь такой же обработчик! Также будут подключены несколько обработчиков, по одному на каждый раз, когда отображается элемент управления.

Первое решение пришло из этой статьи MSDN . Второе пришло из этого блога .

0 голосов
/ 30 ноября 2013

Если вы хотите, чтобы представление данных просто удаляло недопустимые символы для пользователя, а не выдавало сообщение об ошибке, используйте DataGridView.CellParsing (). Это событие срабатывает только после внесения изменений в ячейку и позволяет вам переопределить введенное.

Например:

private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
    // If this is column 1
    if (e.ColumnIndex == 1)
    {
        // Remove special chars from cell value
        e.Value = RemoveSpecialCharacters(e.Value.ToString());
        e.ParsingApplied = true;
    }
}

Для метода RemoveSpecialCharacters () см. в этом вопросе SO о некоторых превосходных методах удаления специальных символов из строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...