C # Winform: ошибка нулевого исключения при проверке значения ячейки GridDataView - PullRequest
0 голосов
/ 01 мая 2019

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

    private void gridData_CellEndEdit(object sender, DataGridViewCellEventArgs e) {

        // If Cell Edited is in the Add'l Qty Column
        if (gridData.Columns[e.ColumnIndex].Name == "AddlQty") {
            int intVal;

            // Validate Entry for Numeric Only
            if (int.TryParse(gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(), out intVal)) {
                CalcFinalQty(e.RowIndex);
            } else {
                // Clear and Send User Back to Try Again
                gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "";
                gridData.CurrentCell = gridData.Rows[e.RowIndex].Cells[e.ColumnIndex];
                MessageBox.Show("Entry Not Valid, Only Numeric Values Accepted");
                gridData.BeginEdit(true);
            }
        }
    } // End gridData_CellEndEdit

Он ловит, числовое оно или нет, стирает ячейку, но отображаетMessageBox дважды.После первого раза выбранная ячейка перемещается к следующей ячейке вниз, появляется другой MessageBox, и ТО возвращается к ячейке и настраивается для редактирования.

Если вы нажмете Enter, не вводя ничего в ячейку,выдает ошибку исключения Null.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

У меня есть подозрение здесь.Я думаю, что beginEdit как-то запускает событие во второй раз.Если это так, можете ли вы дважды проверить в своем операторе else, что значение не пустое, а если нет, то показать окно сообщения?это было бы что-то вроде:

private void gridData_CellEndEdit(object sender, DataGridViewCellEventArgs e) {

    // If Cell Edited is in the Add'l Qty Column
    if (gridData.Columns[e.ColumnIndex].Name == "AddlQty") {
        int intVal;

        // Validate Entry for Numeric Only
        if (int.TryParse(gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(), out intVal)) {
            CalcFinalQty(e.RowIndex);
        } else {
            if(!String.IsNullOrEmpty(gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()))
            // Clear and Send User Back to Try Again
            gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "";
            gridData.CurrentCell = gridData.Rows[e.RowIndex].Cells[e.ColumnIndex];
            MessageBox.Show("Entry Not Valid, Only Numeric Values Accepted");
            gridData.BeginEdit(true);
        }
    }
}

Дайте мне знать, если это поможет, ура.

1 голос
/ 01 мая 2019

Попробуйте присвоить значение "0" вместо очистки.

gridData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "0";

При выполнении gridData.BeginEdit(true); возвращается к событию редактирования и переходит к каждой ячейке и Try.Parse part вызывается снова.

Try.Parse становится ложным, потому что не может проанализировать "" значение int.

Это гарантирует, что ваше приложение будет принудительно устанавливать нулевое значениекогда пользователь ничего не положил.

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