Мне известны два подхода, которые вы можете использовать для этого. Первое (и я думаю, что лучше всего) - использовать событие 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 . Второе пришло из этого блога .