gpt4 book ai didi

c# - 由于 DataGridViewImageColumn,DataGridView 在默认错误对话框中抛出异常

转载 作者:可可西里 更新时间:2023-11-01 08:48:18 24 4
gpt4 key购买 nike

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

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

The Following Exception occurred in the DataGridView:

System.ArgumentException: Parameter is not valid. at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)"

在我的设置中,我在 Visual Studio Designer 中创建了 DataGridViewImageColumns,然后通过设置 DataGridViewImageColumns 的 DataPropertyName 属性以匹配类型为 byte[] 的 DataColumns,将这些列绑定(bind)到 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 生效?对此有最佳方法吗?

最佳答案

我的解决办法:添加完列就直接删除(详细原因在文末)。以下代码删除了所有可能的图像列,如果您的架构不是动态的并且您知道要删除的内容,您可能需要自定义此列:

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);
}

所以说到实际的绑定(bind)

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;
}
}
}
}

但我仍然有一些异常(exception)。另外,如果您的绑定(bind)是双向的,请注意,因为 cell.Value = DBNull.Value; 会导致业务对象发生变化!这就是我建议删除该列的原因。

关于c# - 由于 DataGridViewImageColumn,DataGridView 在默认错误对话框中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com