Я излагаю это, потому что слишком много времени, чтобы найти ответ в Интернете, и это, вероятно, общая проблема - это второй раз, когда я испытал это в своем приложении.
Когда новая строка с DataGridViewImageCell становится видимой и не имеет значения по умолчанию, мой DataGridView выдает следующее исключение:
В DataGridView произошло следующее исключение:
System.ArgumentException: параметр недействителен. в System.Drawing.Image.FromStream(поток потока, логический useEmbeddedColorManagement, Boolean validateImageData) "
В моей настройке я создаю DataGridViewImageColumns в Visual Studio Designer, а затем привязываю эти столбцы к DataColumns в DataTable, устанавливая свойства DataPropertyName в DataGridViewImageColumns в соответствии с DataColumns типа: byte [].
Тем не менее, он по-прежнему выбрасывает это исключение, когда DataGridViewImageColumn в новой строке становится видимым.
Есть два обходных решения, которые работали для меня:
- Снимите флажок "Включить добавление" в конструкторе - затем добавьте строки программно - с помощью кнопок и т.д. - Я думаю, что это то, что я сделал в первый раз.
-
Обработайте событие DataError DataGridView следующим образом:
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == DBNull.Value) { e.Cancel = true; } }
Это вариант, с которым я сейчас пользуюсь, но я не поклонник подавления исключений, и я вижу задержку в создании строки DataGridView из-за броска + Catch обработчиком.
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;
}
}
}
... который не работает.
Другой параметр включал установку столбца CellTemplate в тип, полученный из DataGridViewImageColumn со значением по умолчанию null или DBNull.Value.
Это немного поздно для этого сейчас - я был на этом весь день.
Я, вероятно, собираюсь пойти на свой вариант 2, но может ли кто-нибудь сказать мне, как получить вариант 3/4 для работы? Есть ли лучший подход для этого?