【问题标题】:Specified argument was out of the range of valid values - dataGridView maskedTextBox指定的参数超出了有效值的范围 - dataGridView maskedTextBox
【发布时间】:2013-05-22 13:09:57
【问题描述】:

我正在尝试在 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;
                }
        }
    }

【问题讨论】:

    标签: c# winforms c#-4.0 datagridview datagridviewcolumn


    【解决方案1】:

    这似乎是一个错误,它 .NET 有时在 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);
           //...
        }
    

    您也可以考虑清理返回值,因为它不能保证是正确的类型或范围。

    我意识到这个问题已经晚了,但希望它可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多