С# FormatException в DataGridView

Я создал DataGridView с некоторыми столбцами. Столбцы заказа позволяют пользователям вводить только число int. Он выдает FormatException, когда я ввожу «j» (например), и я пытаюсь добавить try catch, чтобы решить проблему, но, похоже, это не работает.

private void Form1_Load(object sender, EventArgs e)
{
  try{
     this.sourceTable = new DataTable(TableName);
     this.sourceTable.Columns.Add(new DataColumn(OrderCol, Type.GetType("System.Int32")));

     dataGridView1.DataSource = sourceTable;
  }catch(FormatException){
     MessageBox.Show("Please enter a number");
  }
}

person Quan    schedule 25.10.2013    source источник
comment
Я не уверен на 100%, но вы можете попробовать добавить TypeLoadException в дополнение (или вместо) к существующему FormatException.   -  person user2771704    schedule 25.10.2013
comment
Этот try-cache работает только во время загрузки формы. Позже это не будет иметь никакого эффекта. Может быть, вы могли бы проверить ввод с помощью DataColumnChangeEventHandler?   -  person Mickey    schedule 25.10.2013
comment
Было бы здорово, если бы вы могли прокомментировать, ответит ли мой ответ ниже на ваш вопрос или остались ли какие-либо вопросы. Если это то, что вы ищете, было бы здорово, если бы вы могли принять ответ, чтобы другие пользователи с такой же проблемой могли видеть, что вам помогло.   -  person Mickey    schedule 25.10.2013


Ответы (2)


Попробуйте это: я добавил событие для изменения столбца, где я могу проверить ввод при его отправке.

private DataColumn dataColumn;
        private void Form1_Load(object sender, EventArgs e)
        {

                this.sourceTable = new DataTable(TableName);
                dataColumn = new DataColumn(OrderCol);
                this.sourceTable.Columns.Add(dataColumn);
                sourceTable.ColumnChanged += sourceTable_ColumnChanged; // Eventhandler for column changes

                dataGridView1.DataSource = sourceTable;

        }

        void sourceTable_ColumnChanged(object sender, DataColumnChangeEventArgs e)
        {
            try
            {
                int i = Convert.ToInt32(e.ProposedValue);

            }
            catch (FormatException)
            {
                MessageBox.Show("Please enter a number");
            }
        }
person Mickey    schedule 25.10.2013

Обработка события DataGridView.CellValidating:

    private void CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        try
        {
            // get current cell
            var cell = ((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex];
            // check new value. i need any number >= 5
            var c0 = 0;
            if (e.FormattedValue == null || !Int32.TryParse(e.FormattedValue.ToString(), out c0) || c0 < 5)
            {
                // bad value inserted

                // e.FormattedValue - is new value
                // cell.Value - contains 'old' value

                // choose any:
                cell.Value = cell.Value;    // this way we return 'old' value
                e.Cancel = true;            // this way we make user not leave the cell until he pastes the value we expect
            }
        }
        catch (Exception ex)
        {
        }
    }
person artem    schedule 30.06.2015