2015-05-08 1 views
1

У меня есть DataGridView, который получен из datatable. Я пытаюсь остановить ввод пользователем нечисловых или отрицательных целых чисел или удвоений в разные столбцы из datagridview.Проверка DataGridView в C# win form

Я понимаю, что метод CellValidating обычно используется, но я не могу заставить его отображать отрицательные значения.

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("Quantity")) return; 

     int output; 

     // Confirm that the cell is an integer. 
     if (!int.TryParse(e.FormattedValue.ToString(), out output)) 
     { 
       MessageBox.Show("Quantity must be numeric"); 
       e.Cancel = true; 
     } 
     else if (output <= 0) 
     { 
      MessageBox.Show("Quantity must not be negative"); 
      e.Cancel = true; 
     } 
    } 

С приведенным выше кодом я все еще могу получить отрицательные или даже нулевые значения в ячейках количества.

Помощь очень ценится Спасибо

+0

Это может решить проблему ... http://stackoverflow.com/a/4743070/1928632 – SiD

ответ

1

Я думаю, вы должны поместить MessageBox код после Отменить событие.

Потому что, когда MessageBox всплывает, он теряет фокус с Cell, потеря фокуса не позволит событию Cancel.

// Confirm that the cell is an integer. 
if (!int.TryParse(e.FormattedValue.ToString(), out output)) 
{     
     e.Cancel = true; 
     MessageBox.Show("Quantity must be numeric"); 
} 
else if (output <= 0) 
{    
    e.Cancel = true; 
    MessageBox.Show("Quantity must not be negative"); 
} 
+0

Я только что попробовал, но это не имеет никакого значения. Я все еще могу указать отрицательные значения, но это не позволит мне вводить числовые значения. У меня также есть событие DataError, которое позволяет захватить пользователя, пытающегося ввести типы данных, которые являются недопустимыми, и выводить сообщение, но я не могу точно указать отрицательные значения. –

1

Я считаю, что правильный подход заключается в использовании свойства ErrorText.

dataGridView1.Rows[e.RowIndex].ErrorText = "Quantity must not be negative"; 

Это дает четкое указание, как: enter image description here

Вы также можете использовать CellEndEdit событие:

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

Когда Заголовки строк не видны:

В этом случае, валидация все еще работает, однако сообщение об ошибке и значок не отображаются. Используйте this approach с CellEndEdit, даже чтобы получить больше контроля. Это будет работать, даже если заголовки строк не видны.

+0

Решает проблему. – SiD

+0

Да, вы правы, проблема была направлена ​​на фокус. – Fabio

+0

Будет ли это работать, даже если у меня нет заголовков строк, установленных как видимых? Я хотел, чтобы пользовательский интерфейс выглядел чище. Спасибо за помощь! –