Указанный аргумент находится вне диапазона допустимых значений — dataGridView maskedTextBox

Я пытаюсь разместить замаскированное текстовое поле в столбце dataGridView. Предполагается, что пользователь вводит допустимые значения даты в формате дд/мм/год, и я следовал примеру здесь http://www.codeproject.com/Articles/26005/DataGridViewColumn-Hosting-MaskedTextBox

Однако у меня возникли проблемы с фрагментом кода ниже. У меня есть предварительно заполненные строки, и пользователь должен обновлять только столбец Date, который по умолчанию равен NULL в базе данных.

Когда я нажимаю на столбец, чтобы перевести его в режим редактирования, я получаю сообщение об ошибке

Указанный аргумент находится вне диапазона допустимых значений в строке if (Value == null || Value is DBNull)

ниже проблемный фрагмент кода и скриншот снимка исключения

 public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
        MaskedEditEditingControl editingControl = base.DataGridView.EditingControl as MaskedEditEditingControl;
        if (editingControl != null)
        {
            if (Value == null || Value is DBNull)
                editingControl.Text = (string)DefaultNewRowValue;
            else
                switch (Value.GetType().FullName)
                {
                    case "System.DateTime":
                        DateTime dt = (DateTime)Value;
                        editingControl.Text = dt.ToString("dd-MM-yyyy hh:mm");
                        break;
                    case "System.String":
                        editingControl.Text = (string)Value;
                        break;
                }
        }
    }

введите здесь описание изображения


person StackTrace    schedule 22.05.2013    source источник


Ответы (1)


Кажется, это ошибка, из-за которой .NET иногда использует неверный rowIndex в средстве доступа к свойству DataGridViewCell.Value. Мы не можем легко заглянуть внутрь этого или что-то с этим сделать.

Я столкнулся с этой же проблемой. У меня сначала все нормально, но при переходе в другую ячейку вылетает ошибка. Я работаю с DataGridView в виртуальном режиме, но это может быть неактуально.

Вы можете довольно легко обойти это, заменив свойство Value функцией Cells GetValue().

    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
       //... 
       //DateTime dt = (DateTime)this.Value;
       DateTime dt = (DateTime)this.GetValue(rowIndex);
       //...
    }

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

Я понимаю, что поздно для этого вопроса, но, надеюсь, это может помочь кому-то еще.

person Ed Hartley    schedule 21.06.2017