5

我已经看到很多涉及数据绑定的解决方案,但我没有数据源。在这种情况下,组合单元格仅适用于 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 窗体无效是否公平?

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

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

我也尝试过手动覆盖列值(当我没有这个问题时成功)。不过没修。

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

现在我只是清除了 DataError 方法。

有什么建议么?

4

6 回答 6

3

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

这是一种可能处理 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));
            }
        }
    }

这样,该值将被添加到项目集合中,但仍会在可以记录的位置引发异常。我使用了消息框,因为我仍然认为用户体验错误消息并联系支持人员修复它很重要。希望这对某人有帮助!

于 2014-09-03T14:38:00.983 回答
1
  1. 使用 WPF。

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

  3. 唱一首歌 -在您意识到在 WPF 中实现这很容易之后,您会想要!

于 2013-10-21T20:24:51.777 回答
1

我今天遇到了同样的异常,花了很多时间来解决这个问题。事实证明,当为 datagridview 创建新行时,我调用了一个事件处理程序。在该事件处理程序方法中,我错误地将组合框单元格值设置为组合框的项目集合中不存在的值。

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

于 2015-05-15T13:57:50.227 回答
1

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

于 2015-12-26T15:26:50.777 回答
0

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

例如,

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

GetAllMovementKind 方法返回一个List<Model.MovementKind>

我希望它对你有帮助。

于 2015-09-23T15:33:47.910 回答
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);

}

在此示例中,管理特定列索引中的控制 od DateTime 字段。

于 2018-02-13T07:37:24.947 回答