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?

questionAnswers(3)

yourAnswerToTheQuestion