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

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



在我的设置中,我在Visual Studio Designer中创建DataGridViewImageColumns,然后通过设置DataGridViewImageColumns的DataPropertyName属性以匹配Type:byte []的DataColumns,将这些列绑定(bind)到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;
            }
        }
    

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

    MSDN(http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewimagecolumn.aspx)表示,您可以处理RowFyre事件并强制使用空值。我尝试了这个:
        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派生的Type,其默认值为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);
    }
    

    所以说到实际的装订
    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/

    10-10 06:00