我提出这个问题是因为在网上找到答案的时间太长了,这可能是一个常见问题 - 这是我第二次在我的应用程序上体验它。
当带有 DataGridViewImageCell 的新行变得可见并且没有设置默认值时,我的 DataGridView 会引发以下异常:
DataGridView 中发生以下异常:
System.ArgumentException:参数无效。在 System.Drawing.Image.FromStream(流流,布尔值 useEmbeddedColorManagement,布尔值 validateImageData)"
在我的设置中,我在 Visual Studio 设计器中创建 DataGridViewImageColumns,然后通过设置 DataGridViewImageColumns 的 DataPropertyName 属性以匹配类型为字节 [] 的 DataColumns,将这些列绑定到 DataTable 中的 DataColumns。
但是,当新行中的 DataGridViewImageColumn 变为可见时,它仍然会引发此异常。
有两种解决方法对我有用:
- 取消选中设计器中的“启用添加”选项 - 然后以编程方式添加行 - 使用按钮等 - 我认为这是我第一次做的事情。
像这样处理 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 起作用?有没有最好的方法呢?