2012-08-02 67 views
12

我有一個現有的應用程序,需要在DataGridView單元格中顯示圖像以指示記錄是否具有與其關聯的特定標誌(不是用戶可編輯,這來自數據庫)。如何從DataTable填充時禁用DataGridView圖像列中的空圖像

如果有標誌,我會顯示相應的圖像,如果沒有標誌,我不想在列中顯示任何內容。

DataGridView列不是在Visual Studio設計器中創建的,否則這很容易。我可以在列上設置NullValue屬性。相反,當所有數據加載到DataTable中時,在運行時創建列,然後從該DataTable創建DataView,然後將DataGridView的數據源設置爲DataView。

我不能完全重寫這個,否則我只是在VS Designer中定義列,而不是這種讓數據表定義列的荒謬方式。

那麼我的問題是,我怎樣才能讓底圖數據表有空的時候帶圖像的列什麼都不顯示?

下面是一些僞C#來說明我的意思。請記住,我沒有寫它來使用這樣的兩個DataTable;它是這樣,當我不得不把它交給我,我不想做太大改動只是爲了添加新列...

DataTable rawData = someMethodThatReturnsMyRawData(); 
DataTable data = new DataTable(); 
data.Columns.Add("Flags", typeof(Image)); 
data.Columns.Add("SomeOtherColumn"); 

foreach (DataRow rawDataRow in rawData.Rows) 
{ 
    DataRow dataRow = data.NewRow(); 
    bool hasFlagType1 = false; 
    bool hasFlagType2 = false; 

    if (rawDataRow["FlagType1ID"] != DBNull.Value) 
    { 
     hasFlagType1 = true; 
    } 

    if (rawDataRow["FlagType2ID"] != DBNull.Value) 
    { 
     hasFlagType2 = true; 
    } 

    if (hasFlagType1 && hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.BothFlagsImage; 
    } 
    else if (hasFlagType1) 
    { 
     dataRow[0] = Properties.Resources.FlagType1Image; 
    } 
    else if (hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.FlagType2Image; 
    } 
    else 
    { 
     //If neither flag set, I don't want it to show anything, 
     //but if I leave it as null, a little box with an X in it shows up 
     //I could set it to some transparent GIF here, but that seems lame 
    } 

    dataRow[1] = rawDataRow["SomeOtherColumn"]; 

    data.Rows.Add(dataRow);   
} 

DataView dv = new DataView(data, string.Empty, "SomeOtherColumn ASC", DataViewRowState.CurrentRows); 

this.emptyDataGridViewFromDesigner.DataSource = dv; 

// How can I modify the column "Flags" at this point to show nothing if the value is null? 

編輯:下面是截圖,所以你可以看到我是什麼意思通過與X的小盒子 - 這些都是空...

DataGridView with Null Images

而且,它必須是.NET 3.5,所以如果有在.NET 4.0中的解決方案而已,我走了運氣。

回答

25

我想通了這一點......

不得不轉換列作爲DataGridViewImageColumn,然後設置DefaultCellStyle.NullValue爲該列設置爲空。從上面我舉的例子,你會做這樣的......

((DataGridViewImageColumn)this.emptyDataGridViewFromDesigner.Columns["Flags"]).DefaultCellStyle.NullValue = null; 

我想我偷步問在這裏,但希望這可以幫助別人的某個時候。

+0

如何在VB.NET中執行相同操作? =我猜想沒有? – 2016-03-17 06:52:02

+0

我有這個解決方案不適用於最後一行 – camino 2017-01-29 16:28:58

2

要修復整個網格,只需將此代碼添加到Form構造函數。 (並更改您的dataGrid的名稱):

 Load += delegate 
     { 
      // remove default [x] image for data DataGridViewImageColumn columns 
      foreach (var column in dataGridView1.Columns) 
      { 
       if (column is DataGridViewImageColumn) 
        (column as DataGridViewImageColumn).DefaultCellStyle.NullValue = null; 
      } 
     };