我有一个绑定到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下载。