2011-08-05 85 views
20

我在C#中的小的應用程序,它有一個被使用填充一個DataGridView:如何在使用自定義DataSource時隱藏DataGridView的列?

grid.DataSource = MyDatasource array;

MyClass的保持柱的結構,它看起來是這樣的:

class MyDatasource 
{ 
    private string column1;   
    private string column2; 

    public MyDatasource(string arg1, string arg2) 
    { 
     this.column1 = arg1; 
     this.column2 = arg2; 
    } 

    public string column1 
    { 
     get 
     { 
      return this.column1; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 

    public string column2 
    { 
     get 
     { 
      return this.column2; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 
} 

一切工作正常,並且DataGridView被填充正確的數據,但現在我想隱藏column2。我試圖在列聲明上面添加[Browsable(false)],這會隱藏它,但我也需要從代碼訪問列值,並且當我使用[Browsable(false)]並嘗試讀取內容時,它的行爲就像列不存在一樣。如果我不使用它,我可以毫無問題地閱讀該列,但它在DataGridView中可見。

我怎麼能隱藏列,但仍然能夠從代碼中讀取其內容?

回答

2

設置特定列的Visible屬性= false

dataGridView[ColumnName or Index].Visible = false;

編輯 遺憾無緣Columns物業 dataGridView.Columns[ColumnName or Index].Visible = false;

31

你要隱藏在網格視圖控件的柱上,而不是在數據源。將它隱藏在數據源中根本不會呈現給網格視圖,因此您將無法訪問網格視圖中的值。按照你建議的方式進行,你將不得不通過數據源訪問列值,而不是網格視圖。

要隱藏網格視圖控制欄,你可以使用這樣的代碼:

dataGridView1.Columns[0].Visible = false; 

從數據源訪問列,你可以嘗試這樣的事:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"]; 
+0

'Visible'在創建控件後是「ReadOnly」。 –

6

我不確定它是否爲時已晚,但問題是,如果您在運行時進行綁定,則無法在設計模式下設置列。因此,如果您在運行時進行綁定,請繼續並從設計模式中刪除列並以務實的態度去做

恩..

​​
35

在某些情況下,它可能是一個壞主意,先列添加到DataGridView,然後將其隱藏。

例如,我有一個類有一個公司徽標的圖像屬性的NHibernate代理。如果我訪問該屬性(例如,通過調用其ToString方法在DataGridView中顯示),它將從SQL服務器下載圖像。如果我有一個公司對象的列表,並用它作爲DataGridView的dataSource,那麼(我懷疑)它會下載所有的標誌,然後我可以隱藏該列。

爲了防止這種情況,我用自定義屬性

[System.ComponentModel.Browsable(false)] 

上的圖像性能,使DataGridView中忽略的屬性(不創建列,並且不調用的ToString方法)。

public class Company 
{ 
    ... 
    [System.ComponentModel.Browsable(false)] 
    virtual public MyImageClass Logo { get; set;} 
+0

這絕對是最好的方式來做到這一點,如果你與你知道你永遠不會想要顯示的財產工作。 – Henry

+1

這是最好的答案。期。 – Buddha

+0

最優雅的解決方案夥伴編碼器+1 – ChenChi

0

我有同樣的問題

下面是可能適合您的解決方案。它的工作對我來說

GridView1.DataBind(); 
if (GridView1.Columns.Count > 0) 
    GridView1.Columns[0].Visible = false; 
else 
{ 
    GridView1.HeaderRow.Cells[0].Visible = false; 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     gvr.Cells[0].Visible = false; 
    } 
} 
4

我注意到,如果使用progrmmatically它呈現不完整的(整個形式根本不「畫」任何東西),如果使用前panel1.Controls.Add(dataGridView);然後dataGridView.Columns["ID"].Visible = false;將打破整個表格並使其空白,所以以獲得設置此AFTER EG:

panel1.Controls.Add(dataGridView); 
dataGridView.Columns["ID"].Visible = false; 
//works 

dataGridView.Columns["ID"].Visible = false; 
panel1.Controls.Add(dataGridView); 
//fails miserably 
相關問題