31

私は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 に表示されます。

列を非表示にしながら、コードからその内容を読み取ることができるようにするにはどうすればよいですか?

4

10 に答える 10

49

場合によっては、最初に列を DataGridView に追加してから非表示にすることをお勧めしません。

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

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

 [System.ComponentModel.Browsable(false)]

これにより、DataGridView はプロパティを無視します (列を作成せず、ToString メソッドを呼び出しません)。

 public class Company
 {
     ...
     [System.ComponentModel.Browsable(false)]
     virtual public MyImageClass Logo { get; set;}
于 2013-01-18T07:19:56.170 に答える
41

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

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

dataGridView1.Columns[0].Visible = false;

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

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
于 2011-08-05T18:29:39.613 に答える
5

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

元..

     if (dt.Rows.Count > 0)
    {
        dataGridViewProjects.DataSource = dt;
        dataGridViewProjects.Columns["Title"].Width = 300;
        dataGridViewProjects.Columns["ID"].Visible = false;
    }
于 2012-12-10T17:21:45.990 に答える
3

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

dataGridView[ColumnName or Index].Visible = false;

Columnsプロパティ を見逃してすみませんdataGridView.Columns[ColumnName or Index].Visible = false;

于 2011-08-05T18:27:05.290 に答える
1

私は同じ問題を抱えていました

これがあなたのために働くかもしれない解決策です。それは私のために働いた

    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;
    }
}
于 2013-04-15T12:03:31.903 に答える
0

MyDataGridView.RowHeadersVisible = False; 各列ヘッダーをバインドして名前を変更し、列幅を設定する前に。検索するときに失敗した記憶を助けるために、検索するので...それは確かです;-)

于 2021-01-16T19:37:52.063 に答える