我正在尝试在dataGridView列中托管一个蒙版文本框。用户应该以dd / mm / year的格式输入有效的日期值,我跟着这里的例子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;
}
}
}
答案 0 :(得分:1)
它似乎是一个错误,它有时会在DataGridViewCell.Value属性访问器中使用不正确的rowIndex。我们无法轻易看到内部或做任何事情。
我遇到了同样的问题。对我来说,它一开始很好但是当进入另一个单元时,错误就会发生。我在虚拟模式下使用DataGridView,但这可能不相关。
您可以通过替换单元格GetValue()函数代替Value属性来轻松解决它。
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
//...
//DateTime dt = (DateTime)this.Value;
DateTime dt = (DateTime)this.GetValue(rowIndex);
//...
}
您也可以考虑清理返回值,因为它不能保证正确的类型或范围。
我意识到这个问题已经迟到了,但希望它可以帮助其他人。