web-dev-qa-db-ja.com

カスタムDataSourceを使用するときにDataGridViewの列を非表示にする方法

私はC#で小さなアプリを持っています、それは使用して満たされる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に表示されます。

列を非表示にしながら、コードからコンテンツを読み取ることができる方法はありますか?

27
mglog

場合によっては、最初に列をDataGridViewに追加してから非表示にするのは悪い考えかもしれません。

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

これを防ぐために、カスタム属性を使用しました

 [System.ComponentModel.Browsable(false)]

imageプロパティで、DataGridViewがプロパティを無視するようにします(列を作成せず、ToStringメソッドを呼び出しません)。

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

データソースではなく、グリッドビューコントロールで列を非表示にする必要があります。データソースで非表示にすると、グリッドビューにはまったく表示されないため、グリッドビューの値にアクセスできなくなります。提案されている方法で行うと、グリッドビューではなく、データソースを介して列の値にアクセスする必要があります。

グリッドビューコントロールの列を非表示にするには、次のようなコードを使用できます。

dataGridView1.Columns[0].Visible = false;

データソースから列にアクセスするには、次のようなものを試すことができます。

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

プログラム的に使用すると、panel1.Controls.Add(dataGridView); then 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
6
Mr Heelis

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

例.

     if (dt.Rows.Count > 0)
    {
        dataGridViewProjects.DataSource = dt;
        dataGridViewProjects.Columns["Title"].Width = 300;
        dataGridViewProjects.Columns["ID"].Visible = false;
    }
5

その特定の列のVisibleプロパティ= falseを設定します

dataGridView[ColumnName or Index].Visible = false;

編集ColumnsプロパティdataGridView.Columns[ColumnName or Index].Visible = false;

2
Haris Hasan

同じ問題があった

解決策は次のとおりです。それは私のために働いた

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

DataGridView.AutoGenerateColumns = false;

右上隅の矢印(datagridview内)をクリックして列を追加する必要があり、DataPropertyNameでクラスにプロパティの名前を入力する必要があります。

次に、datagridviewで列を定義した後、datagridview.datasource = myClassViewModel

0
Danilo Bicas