如何捕获DataGridView验证在可编辑单元格中写入值时出错?

时间:2013-10-21 19:42:51

标签: c# .net winforms datagridview

我已经看到很多涉及数据绑定的解决方案,但我没有数据源。在这种情况下,组合单元格仅适用于1行(其他行没有DataGridViewComboBoxCell)。

我像这样设置DataGridViewComboCell:

DataGridViewComboBoxCell cell = new DataGridViewComboBoxCell();
cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
cell.Items.AddRange(items.ToArray());   // items is List<string>

我会像以后一样动态重新填充它:

_cell.Items.Clear();
_cell.Items.AddRange(this.Data.ResponseOptions.Select( d => d.Description).ToArray());   
//d.Description is of type string

然后我得到了这个令人讨厌的对话框,上面写着:

  

DataGridView中发生以下异常:   System.ArgumentException:DataGridViewComboBoxCell值无效。   要替换此默认对话框,请处理DataError事件。

顺便说一句,说它不是“有效”,这没什么用。向MS发送电子邮件说Windows Forms无效是否公平?

我尝试抓取单元格的items属性,并使用带有Add()调用的foreach()添加字符串。我仍然得到对话框。

每次我想要更新它并从头开始重新创建一个新的DataGridViewComboCell时,我也试过吹掉整个单元格。我仍然得到对话框。

我也试过手动覆盖列值(当我没有这个问题时成功)。但是没有解决它。

当我尝试重新填充组合单元格中的项目时,我似乎只能得到此对话框。

现在我刚刚删除了DataError方法。

有什么建议吗?

6 个答案:

答案 0 :(得分:3)

这个问题有点陈旧,但我遇到了这个问题,事实证明ThunderGR绝对是正确的。当我有DataError打印报告时,我开始查看数据库中的值,并注意到它们实际上都在所有CAPS中。只需将我的字符串值更改为全部大写字母,就不会再收到错误。

这是一种可能处理DataError的方法,尽管我不想在第一时间解雇它。

    private void dataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        try
        {
            if (e.Exception.Message == "DataGridViewComboBoxCell value is not valid.")
            {
                object value = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                if (!((DataGridViewComboBoxColumn)dataGridView.Columns[e.ColumnIndex]).Items.Contains(value))
                {
                    ((DataGridViewComboBoxColumn)dataGridView.Columns[e.ColumnIndex]).Items.Add(value);
                }
            }

            throw e.Exception;
        }
        catch (Exception ex)
        {
            bool rethrow = ExceptionPolicy.HandleException(ex, "UI Policy");
            if (rethrow)
            {
                MessageBox.Show(string.Format(@"Failed to bind ComboBox. "
                + "Please contact support with this message:"
                + "\n\n" + ex.Message));
            }
        }
    }

这样,该值将被添加到items集合中,但仍会抛出可以记录的异常。我使用了一个消息框,因为我仍然认为用户遇到错误消息并联系支持以解决它是很重要的。希望这有助于某人!

答案 1 :(得分:1)

  1. 使用WPF。

  2. 将DataGrid中的组合框列绑定到List。

  3. 在你意识到在WPF中实现它是多么容易之后,唱一首歌 - 你想要

答案 2 :(得分:1)

我今天遇到了同样的例外,花了很多时间搞清楚这个问题。原来我在为datagridview创建了一个新行时调用了一个事件处理程序。在那个事件处理程序方法中,我错误地将组合框单元格值设置为combox框的items集合中不存在的值。

因此,简而言之,抛出的异常显示正确的消息。我只需找到确切的位置,设置不正确的值。

答案 3 :(得分:1)

您不需要添加到DataGridViewComboBoxColumn.Items,而是需要将DataGridViewComboBoxColumn.DataSource设置为ResponseOptions列表,并设置DataGridViewComboBoxColumn.ValueType = typeof(ResponseOption)。

答案 4 :(得分:0)

我遇到了同样的问题并解决了它添加到我为数据源分配了与组合框中的空项对应的项目的列表。

例如,

var list = controller.GetAllMovementKind();
list.Add(new Model.MovementKind { Code = 0, Name = String.Empty });
movementKindBindingSource.DataSource = list;

GetAllMovementKind方法返回List<Model.MovementKind>

我希望它对你有所帮助。

答案 5 :(得分:0)

要在DataGridView中管理和验证可编辑数据,请手动添加以下事件:

myDataGridView.DataError += myDataGridView_DataError;

以这种方式实现事件:

private void dataGridApprovazioni_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    DataGridView dataGridView = (DataGridView)sender;
    dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DateTime.MinValue;
    MessageBox.Show("Invalid Date Format", "System Info", MessageBoxButtons.OK, MessageBoxIcon.Error);

}
在这个例子中,

管理e特定列索引中的控制od DateTime fiel。