2011-08-05 2 views
20

私はそれを使用して埋めますDataGridViewの持っている、C#で小さなアプリを持っている:カスタムDataSourceを使用しているときにDataGridViewの列を非表示にする方法は?

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

すべて:

grid.DataSource = MyDatasource array;

MyClassのは、列のための構造を保持し、それは次のようになりますうまく動作し、DataGridViewに正しいデータが取り込まれますが、今はcolumn2を非表示にしたいと考えています。私は[Browsable(false)]を列の宣言の上に追加して隠してみましたが、コードから列の値にアクセスする必要があります。[Browsable(false)]を使用し、その列が存在しない場合のように動作します。私はそれを使用しない場合、問題なく列を読み取ることができますが、それはDataGridViewで表示されます。

どのようにして列を非表示にできますが、コードからその内容を読み取ることができますか?特定の列のVisibleプロパティ= false

dataGridView[ColumnName or Index].Visible = false;

編集 申し訳ありませんが、Columnsプロパティ dataGridView.Columns[ColumnName or Index].Visible = false;

答えて

2

セットあなたはではなく、グリッドビューコントロールで列を非表示にする必要がありますデータソースデータソースで非表示にすると、グリッドビューには表示されません。したがって、グリッドビューの値にアクセスすることはできません。それを示唆しているように、グリッドビューではなくデータソースを通じて列値にアクセスする必要があります。

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

を逃した

+0

コントロールが作成された後に 'Visible'が「ReadOnly」になります。 –

6
:あなたはこのような何かを試すことができ、

dataGridView1.Columns[0].Visible = false; 

は、データ・ソースから列にアクセスするには:

は、あなたがこのようなコードを使用することができ、グリッドビューコントロールの列を非表示にするには

私はそれが遅すぎるかどうかはわかりませんが、問題は、実行時にバインドする場合はデザインモードで列を設定できないことです。したがって、実行時にバインドする場合は、それを実用的に行う

EX ..いくつかのケースでは

​​
35

、最初のDataGridViewに列を追加し、それを隠すために悪い考えかもしれません。

たとえば、会社のロゴのImageプロパティにNHibernateプロキシを持つクラスがあります。そのプロパティにアクセスした場合(ToStringメソッドを呼び出してDataGridViewに表示するなど)、SQLサーバーからイメージをダウンロードします。私がCompanyオブジェクトのリストを持っていてDataGridViewのdataSourceとしてそれを使用していた場合、列を非表示にする前にすべてのロゴをダウンロードすることになりました。これを防止するために

DataGridViewのプロパティを無視するように、私は(列を作成していないとのToStringメソッドを呼び出すことはありません)、カスタム属性に画像特性上

[System.ComponentModel.Browsable(false)] 

を使用。

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

あなたが表示したくないことを知っているプロパティを使って作業している場合、これを行う最良の方法は間違いありません。 – Henry

+1

これは最高の回答です。期間。 – Buddha

+0

最も洗練されたソリューション仲間コーダー+1 – ChenChi

0

私は同じ問題がここ

があなたのために働くかもしれないソリューションである持っていました。それはとても、panel1.Controls.Add(dataGridView);その後dataGridView.Columns["ID"].Visible = false;がフォーム全体を破ると、それが空白になります前に使用した場合、私は(フォーム全体は、単に何かを「ペイント」しません)progrmmatically利用される場合、それは不完全なレンダリングことに気づいた

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

私のために働きました

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

dataGridView.Columns["ID"].Visible = false; 
panel1.Controls.Add(dataGridView); 
//fails miserably 
関連する問題