我提出这个问题是因为在网络上找到答案的时间太长了,这可能是一个常见的问题-这是我第二次在我的应用程序中体验到它。
当带有DataGridViewImageCell的新行变为可见,并且未设置默认值时,我的DataGridView会引发以下异常:
在我的设置中,我在Visual Studio Designer中创建DataGridViewImageColumns,然后通过设置DataGridViewImageColumns的DataPropertyName属性以匹配Type:byte []的DataColumns,将这些列绑定(bind)到DataTable中的DataColumns。
但是,当新行中的DataGridViewImageColumn变为可见时,它仍会引发此异常。
有两种解决方法对我有用:
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/