2013-10-20 17 views
10

これは、Web上で答えを見つけるのに時間がかかりすぎたためです。これはおそらく一般的な問題です - これは私がアプリ。DataGridViewがDataGridViewImageColumnによるデフォルトのエラーダイアログで例外をスローする

次の例外は、DataGridViewの中で発生しました::

System.ArgumentExceptionのDataGridViewImageCellで新しい行が見えるようになり、それにはデフォルト値が設定されていない場合は

は、私のDataGridViewのは、以下の例外がスローされます:パラメータが無効です。 System.Drawing.Image.FromStreamを(ストリームストリーム、ブール useEmbeddedColorManagement、ブールvalidateImageData)」では

で私のセットアップ私は、Visual StudioデザイナでDataGridViewImageColumnsを作成し、その後でのDataTableにDataColumnsのにこれらの列をバインドタイプのDataColumnsのに合わせて、DataGridViewImageColumnsのDataPropertyNameプロパティを設定:。。バイトは[]

しかし、それはまだ新しい行にDataGridViewImageColumnが表示されたときに、この例外がスローされます

メートルのために働いていた2つの回避策があります。 E:

  1. チェックを外しデザイナーでオプション「を追加有効にする」 - その後、プログラムの行を追加 - などのボタンを使用して - 私はこれは私が初めてラウンドをやったことだと思います。
  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行の作成は、ハンドラーによってthrow + Catchされるためです。

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; 
      } 
     } 
    } 

...うまくいきませんでした。

他のオプションは、列CellTemplateをDataGridViewImageColumnから派生した型に、デフォルト値のnullまたはDBNull.Valueで設定することでした。

今はちょっと遅れています。これは終日終わりました。

私はおそらく私のオプション2に行くつもりですが、誰かが私にオプション3/4を働かせる方法を教えてくれますか?これには最善の方法がありますか?

+0

dataGridView1_RowsAddedの「動作しなかった」とはどういう意味ですか?あなたはそれを正しく接続しましたか?ハンドラに何か設定した場合、ブレークポイントがヒットしましたか、それともまだ例外を受け取ったことを意味しますか? –

答えて

4

私の解決策:追加した直後に列を削除します(最後に詳細な理由があります)。そう、それは実際の結合

DataTable table = dataTableCombo.SelectedItem as DataTable; 
dataGridView1.DataSource = table; 
に来るとき

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); 
} 

:次のコードは、あなたのスキーマが動的ではなく、あなたが出たままにしたいものを知っている場合は、これをカスタマイズしたい場合があり、すべての潜在的な画像列を削除します

セルにデータを挿入するには、列の追加(および削除の修正)が行われます。そして例外はこのようには起こりません。

また、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; 
      } 
     } 
    } 
} 

しかし、私はまだいくつかの例外があります。さらに、バインディングが双方向の場合は、cell.Value = DBNull.Value;がビジネスオブジェクトの変更を引き起こすため注意してください。それで私は単に列を削除することをお勧めします。

+0

ありがとう、働いて! –

0

この問題は、私のソリューションは、データテーブルの他のデータを作成し、文字列型にすべての列とセルの値を設定して、いくつかの画像およびvarbinary型の列の型によって引き起こされる:

  var clonedDT = dt.Clone(); 

      for (int i = 0; i < clonedDT.Columns.Count; i++) 
      { 
       clonedDT.Columns[i].DataType = typeof(String); 
      } 


      for (int j = 0; j < dt.Rows.Count;j++) 
      { 
       var newRow = clonedDT.NewRow(); 
       for (int i = 0; i < dt.Columns.Count; i++) 
       {       
        newRow.SetField(i, Convert.ToString(item.Value.Rows[j] [i])); 
       } 

       clonedDT.Rows.Add(newRow); 
      } 
0

私はので、いくつかの私のこの問題を得ていました画像はJPEGS、一部はPNGです。

すべてのPNGが原因でエラーが発生していました。

グリッドをスクロールすると、すべてのPNGが削除され、エラーは発生しません。

関連する問題