Wyrzucanie DataGridView Wyjątek w oknie dialogowym błędu domyślnego z powodu DataGridViewImageColumn
Podkreślam to, ponieważ znalezienie odpowiedzi w sieci zajęło dużo czasu i jest to prawdopodobnie powszechny problem - po raz drugi doświadczyłem tego w mojej aplikacji.
Kiedy nowy wiersz z DataGridViewImageCell staje się widoczny i nie ma domyślnego zestawu wartości, mój DataGridView zgłasza następujący wyjątek:
Wystąpił następujący wyjątek w DataGridView:
System.ArgumentException: parametr jest niepoprawny. at System.Drawing.Image.FromStream (Strumień strumienia, Boolean useEmbeddedColorManagement, Boolean validateImageData) "
W mojej konfiguracji tworzę DataGridViewImageColumns w Visual Studio Designer, a następnie wiążę te kolumny z DataColumns w DataTable, ustawiając właściwości DataPropertyName właściwości DataGridViewImageColumns w celu dopasowania DataColumns typu: byte [].
Jednak nadal zgłasza ten wyjątek, gdy DataGridViewImageColumn w nowym wierszu staje się widoczny.
Istnieją dwa sposoby obejścia problemu:
Usuń zaznaczenie opcji „Włącz dodawanie” w Projektancie - następnie dodaj wiersze programowo - za pomocą przycisków itd. - Myślę, że właśnie to zrobiłem za pierwszym razem.Obsługuj zdarzenie DataError w DataGridView w następujący sposób:
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == DBNull.Value)
{
e.Cancel = true;
}
}
Jest to opcja, z którą teraz zmierzam, ale nie jestem fanem tłumienia Wyjątków i widzę opóźnienie w tworzeniu wiersza DataGridView z powodu rzucania + Catch przez Handler.
MSDN (http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewimagecolumn.aspx) mówi, że możesz obsłużyć zdarzenie RowsAdded i wymusić wartość null. Próbowałem tego:
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;
}
}
}
... które nie działa.
Inna opcja obejmowała ustawienie Column CellTemplate na typ wyprowadzony z DataGridViewImageColumn z domyślną wartością null lub DBNull.Value.
Trochę za późno na to teraz - byłem cały dzień.
Prawdopodobnie wybiorę opcję 2, ale czy ktoś może mi powiedzieć, jak uzyskać opcję 3/4 do działania? Czy jest na to najlepsze podejście?