2013-10-20 24 views
10

我這樣做是因爲在網上找到答案花了太長的時間,這可能是一個常見的問題 - 這是我第二次在我的身上體驗過它應用程序。由於DataGridViewImageColumn DataGridView在默認錯誤對話框中拋出異常

當一個新行與DataGridViewImageCell變得可見,並且它沒有默認值設置,我的DataGridView拋出以下異常:

以下異常發生在DataGridView:

System.ArgumentException :參數無效。在 System.Drawing.Image.FromStream(流流,布爾 useEmbeddedColorManagement,布爾validateImageData)」

在我建立我在Visual Studio設計的DataGridViewImageColumns,然後在綁定的DataTable這些列DataColumns當新行的DataGridViewImageColumn變得可見的byte []

但是,它仍然拋出該異常

有跡象表明,對於m工作兩種解決方法:設置DataGridViewImageColumns的DataPropertyName屬性相匹配類型的DataColumns。 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行。

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

......哪些沒有工作。

另一個選項涉及將Column CellTemplate設置爲從DataGridViewImageColumn派生的Type,其默認值爲null或DBNull.Value。

現在有點晚了 - 我一整天都在這裏。

我可能會去我的選項2,但任何人都可以告訴我如何讓選項3/4工作?有沒有最好的辦法呢?

+0

對於dataGridView1_RowsAdded,「哪些不起作用」是什麼意思?你把它正確連接起來了嗎?如果您在處理程序中設置了任何斷點,是否遇到任何斷點?或者您的意思是您仍然收到異常? –

回答

4

我的解決方案:在添加後立即刪除列(詳細原因在最後)。下面的代碼刪除所有潛在圖像列,您可能需要自定義這一點,如果你的模式是不是動態的,你知道你要離開了什麼:

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

所以當它涉及到實際的結合

DataTable table = dataTableCombo.SelectedItem as DataTable; 
dataGridView1.DataSource = table; 

填充單元格會在添加(和刪除校正)列後發生。這種情況不會發生。

此外,在您的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和一些PNGs。

所有PNG都導致錯誤被拋出。

我刪除了所有的PNG,當我向下滾動網格時,我沒有收到任何錯誤。