ArgumentOutOfRangeException当编辑绑定到BindingList的DataGridView时

时间:2017-09-15 18:29:08

标签: c# exception datagridview

我有一个绑定到BindingList的DataGridView。 DGV有三列,其中两列包含DateTime值,另一列包含字符串。因此,前两列是自定义列,其中DateTimePicker作为编辑控件(我基于Microsoft的示例实现了此列)。 我已将AllowUserToAddRows设置为false,因为我希望用户按下按钮以添加新行。按下按钮时,我向BindingList添加一个新条目。到目前为止,这个工作正常,只要按下按钮,就会在DGV上添加一个新行。

    private void btnAdd_Click(object sender, EventArgs e)
    {
        Program.Breaks.Add(new TimePeriod());

        /*foreach (DataGridViewRow row in dgvBreaks.Rows)
        {
            Console.Out.WriteLine("row " + row.Index);
        }*/
    }

但是当我单击一个单元格来编辑内容时,我在InitializeEditingControl()方法中得到一个ArgumentOutOfRangeException,因为该单元格的RowIndex是-1。我点击哪个单元格(如果我添加了几个新行)并不重要,我总是得到这个例外。

    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // set the value of the editing control to the current cell value
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

        DataGridViewTimeEditingControl ctl = DataGridView.EditingControl as DataGridViewTimeEditingControl;

        // exception occurrs here when accessing Value
        if ((Value == null) || (Value == DBNull.Value))
        {
            ctl.Value = (DateTime)DefaultNewRowValue;
        }
        else
        {
            ctl.Value = (DateTime)Value;
        }
    }

我发现如果在将行添加到BindingList之后直接遍历DGV中的所有行,则不会发生异常(请参阅上面注释的foreach循环)。但是这段代码毫无意义(我只是在添加新代码后用它打印出DGV的所有行)。

任何想法我做错了什么?

我有一个可以重现问题的剥离示例项目。您可以从here下载。

0 个答案:

没有答案