ウェブで答えを見つけるのに時間がかかりすぎたため、これを掲載しています。これはおそらく一般的な問題です。アプリでこれを経験したのは 2 回目です。
DataGridViewImageCell を含む新しい行が表示され、デフォルト値が設定されていない場合、DataGridView は次の例外をスローします。
DataGridView で次の例外が発生しました:
System.ArgumentException: パラメーターが無効です。System.Drawing.Image.FromStream (ストリーム ストリーム、ブール値の useEmbeddedColorManagement、ブール値の validateImageData) で"
私のセットアップでは、Visual Studio Designer で DataGridViewImageColumns を作成し、DataGridViewImageColumns の DataPropertyName プロパティを Type: byte[] の DataColumns と一致するように設定して、これらの列を DataTable の DataColumns にバインドします。
ただし、新しい行の DataGridViewImageColumn が表示されると、この例外がスローされます。
私のために働いた2つの回避策があります:
- デザイナーで「追加を有効にする」オプションのチェックを外し、ボタンなどを使用してプログラムで行を追加します。これが私が最初に行ったことだと思います。
DataGridView の DataError イベントを次のように処理します。
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == DBNull.Value) { e.Cancel = true; } }
それは私が今のところ行っているオプションですが、私は例外を抑制するのが好きではなく、ハンドラーによるスロー + キャッチによる DataGridView 行の作成の遅延を見ることができます。
MSDN ( http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewimagecolumn.aspx ) は、RowsAdded イベントを処理して null 値を強制できると述べています。私はこれを試しました:
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;
}
}
}
...うまくいきませんでした。
もう 1 つのオプションでは、Column CellTemplate を DataGridViewImageColumn から派生した Type に設定し、デフォルト値を null または DBNull.Value に設定しました。
今は少し遅いです-私は一日中これにいました。
おそらくオプション 2 を使用するつもりですが、オプション 3/4 を機能させる方法を誰か教えてもらえますか? これに最適なアプローチはありますか?