12

我提出这个问题是因为在网上找到答案的时间太长了,这可能是一个常见问题 - 这是我第二次在我的应用程序上体验它。

当带有 DataGridViewImageCell 的新行变得可见并且没有设置默认值时,我的 DataGridView 会引发以下异常:

DataGridView 中发生以下异常:

System.ArgumentException:参数无效。在 System.Drawing.Image.FromStream(流流,布尔值 useEmbeddedColorManagement,布尔值 validateImageData)"

在我的设置中,我在 Visual Studio 设计器中创建 DataGridViewImageColumns,然后通过设置 DataGridViewImageColumns 的 DataPropertyName 属性以匹配类型为字节 [] 的 DataColumns,将这些列绑定到 DataTable 中的 DataColumns。

但是,当新行中的 DataGridViewImageColumn 变为可见时,它仍然会引发此异常。

有两种解决方法对我有用:

  1. 取消选中设计器中的“启用添加”选项 - 然后以编程方式添加行 - 使用按钮等 - 我认为这是我第一次做的事情。
  2. 像这样处理 DataGridView 的 DataError 事件:

        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == DBNull.Value)
            {
                e.Cancel = true;
            }
        }
    

这是我现在要使用的选项,但我不喜欢抑制异常,我可以看到由于处理程序的 throw + Catch 导致 DataGridView 行的创建延迟。

MSDN ( http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewimagecolumn.aspx ) 说你可以处理 RowsAdded 事件并强制一个空值。我试过这个:

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        foreach (DataGridViewCell cell in dataGridView1.Rows[e.RowIndex].Cells)
        {
            if (cell.GetType() == typeof(DataGridViewImageCell))
            {
                cell.Value = DBNull.Value;
            }
        }
    }

......这没有用。

另一个选项涉及将 Column CellTemplate 设置为从 DataGridViewImageColumn 派生的类型,默认值为 null 或 DBNull.Value。

现在有点晚了——我整天都在这。

我可能会选择我的选项 2,但谁能告诉我如何让选项 3/4 起作用?有没有最好的方法呢?

4

3 回答 3

4

我的解决方案:添加后立即删除该列(最后的详细原因)。以下代码删除了所有潜在的图像列,如果您的架构不是动态的并且您知道要省略什么,您可能需要自定义它:

public Form1()
{
    InitializeComponent();
    dataGridView1.ColumnAdded += dataGrid_ColumnAdded;
}

void dataGrid_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
    if (e.Column.CellType == typeof(DataGridViewImageCell))
        dataGridView1.Columns.Remove(e.Column);
}

所以当涉及到实际的绑定

DataTable table = dataTableCombo.SelectedItem as DataTable;
dataGridView1.DataSource = table;

填充单元格将在添加(和删除更正)列之后发生。异常不会以这种方式发生。

此外,在您的dataGridView1_RowsAdded事件处理程序中要注意:不仅有,e.RowIndex而且还有e.RowCount,而且可以e.RowCount > 1!所以首先我尝试了:

void dataGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
    {
        foreach (DataGridViewCell cell in dataGridView1.Rows[i].Cells)
        {
            if (cell.GetType() == typeof(DataGridViewImageCell))
            {
                cell.Value = DBNull.Value;
            }
        }
    }
}

但我仍然有一些例外。另外,如果您的绑定是双向的,请小心,因为cell.Value = DBNull.Value;会导致业务对象发生变化!这就是我建议宁愿删除该列的原因。

于 2013-10-28T20:59:56.103 回答
0

这个问题是由一些 image 和 varbinary 列类型引起的,我的解决方案是创建其他数据数据表并将所有列和单元格值设置为字符串类型:

            var clonedDT = dt.Clone();

            for (int i = 0; i < clonedDT.Columns.Count; i++)
            {
                clonedDT.Columns[i].DataType = typeof(String);
            }


            for (int j = 0; j < dt.Rows.Count;j++ )
            {
                var newRow = clonedDT.NewRow();
                for (int i = 0; i < dt.Columns.Count; i++)
                {                        
                    newRow.SetField(i, Convert.ToString(item.Value.Rows[j]  [i]));
                }

                clonedDT.Rows.Add(newRow); 
            }
于 2015-02-16T18:59:11.747 回答
0

我遇到了这个问题,因为我的一些图像是 JPEGS,有些是 PNG。

所有PNG都导致引发错误。

我删除了所有 PNG,当我向下滚动网格时我没有收到任何错误。

于 2015-10-05T18:44:57.067 回答