19

DataGridView があり、それにカスタム オブジェクトを追加する必要があります。次のコードを検討してください。

DataGridView grid = new DataGridView();
grid.DataSource = objects;

このコードでは、すべてのプロパティを列として持つ DataGridView オブジェクトを取得します。私の場合、この情報をすべて表示したくはありません。2 つまたは 3 つの列だけを表示したい。設定できることを知っている

AutoGenerateColumns = false.

しかし、その後の進め方がわかりません。1 つのオプションは、興味のないすべての列を非表示にすることですが、逆の方法で行う方がよいと思います。これどうやってするの?

4

8 に答える 8

29

これを行うときはいつでも、通常grid.DataSource、オブジェクトに対する LINQ プロジェクションの結果を作成します。

だから、このようなもの:

grid.DataSource = objects.Select(o => new
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

良い点はAutoGenerateColumns、投影されたオブジェクトのプロパティに基づいて列を生成する true に設定できることです。

編集:

このアプローチの 1 つの欠点は、すべてを匿名オブジェクトに射影することによって、たとえば、クリック イベントで特定のオブジェクトにアクセスする必要がある状況で問題が発生する可能性があることです。

この場合、明示的なビュー モデルを定義し、オブジェクトをそれらに投影する方がよい場合があります。例えば、

class MyViewModel
{
    public int Column1 { get;set; }
    public int Column2 { get;set; }
}

grid.DataSource = objects.Select(o => new MyViewModel()
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

編集2:

MyViewModelに表示するすべての列を表しますDataGridView。もちろん、例のプロパティは、実行している内容に合わせて名前を変更する必要があります。一般に、ViewModel のポイントは、モデル (この場合はオブジェクトのリスト) とビューの間を仲介する一種のコンバーターとして機能することです。

基になるオブジェクトへの参照を保持したい場合は、コンストラクターを介して提供するのが最善の方法かもしれません。

class MyViewModel
{
    public int Column1 { get;set; }
    public int Column2 { get;set; }

    ....

    private SomeType _obj;

    public MyViewModel(SomeType obj)
    {
        _obj = obj;
    }

    public SomeType GetModel()
    {
        return _obj;
    }
}

grid.DataSource = objects.Select(o => new MyViewModel(o)
    { Column1 = o.SomeValue, Column2 = o.SomeOtherValue }).ToList();

基になるモデル オブジェクトを取得するために getter メソッドを使用した理由は、単純に列が生成されないようにするためです。

于 2013-02-10T02:29:20.230 に答える
11

必要に応じて、基になるオブジェクトの任意のプロパティで属性 [Browsable(false)] を使用することもできます。もちろん、これにより、列が他の場所でブラウズ可能になるのを防ぐことができるため、望ましくない場合があります。

于 2013-02-10T02:35:01.613 に答える
11

AutoGenerateColumns = falseこのようにDataPropertyNameを使用してデータバインディングを使用できます

grid.Columns["Column_name_1"].DataPropertyName = "public_property_1";
grid.Columns["Column_name_2"].DataPropertyName = "public_property_2";

このようにして、バインドされた列のみが datagridview に表示され、必要に応じてエディターで列を作成できます。パブリック プロパティは、オブジェクト内の任意のパブリック属性にすることができます。

datagridview からデータを編集している場合は、set メソッドで NotifyPropertyChanged を使用する必要があります。ここで私の質問/回答を参照してください。ここで、これをすべて説明します。

于 2014-01-30T12:39:58.233 に答える
6

このようなことができます。

最初に特定の列のみを表示するには、DataGridView次のようにデータを取得しますDataTable

String query="Your query to dispplay columns from the database";
SqlCommand cmd=new SqlCommand(query,con); //con is your Connection String
con.Open();
DataTable dt=new DataTable();
SqlDataAdapter da=new SqlDataAdapter(cmd);
da.Fill(dt); //Now this DataTable is having all the columns lets say
/* Now take another temporary DataTable to display only particular columns*/
DataTable tempDT=new DataTable();
tempDT=dt.DefaultView.ToTable(true,"Your column name","your column name");
//Now bind this to DataGridView
grid.DataSource=tempDT;
con.Close();

これは非常に長いプロセスであることは承知しています。:P

しかし、私はそれがうまくいくと思います。

于 2014-04-23T06:17:54.300 に答える
6

これは古いプロジェクトの私のコードです。それはあなたの場合に働くことができます。

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM uyeler", baglanti);

da.Fill(dbDataSet1, "uyeler");

//Set AutoGenerateColumns False
dataGridView1.AutoGenerateColumns = false;

//Set Columns Count
dataGridView1.ColumnCount = 5;

//Add Columns
dataGridView1.Columns[0].Name = "İsim"; // name
dataGridView1.Columns[0].HeaderText = "İsim"; // header text
dataGridView1.Columns[0].DataPropertyName = "ad"; // field name

dataGridView1.Columns[1].HeaderText = "Soyisim";
dataGridView1.Columns[1].Name = "Soyisim";
dataGridView1.Columns[1].DataPropertyName = "soyad";

dataGridView1.Columns[2].Name = "Telefon";
dataGridView1.Columns[2].HeaderText = "Telefon";
dataGridView1.Columns[2].DataPropertyName = "telefon";

dataGridView1.Columns[3].Name = "Kayıt Tarihi";
dataGridView1.Columns[3].HeaderText = "Kayıt Tarihi";
dataGridView1.Columns[3].DataPropertyName = "kayit";

dataGridView1.Columns[4].Name = "Bitiş Tarihi";
dataGridView1.Columns[4].HeaderText = "Bitiş Tarihi";
dataGridView1.Columns[4].DataPropertyName = "bitis";

dataGridView1.DataSource = dbDataSet1;
dataGridView1.DataMember = "uyeler";
于 2015-06-15T22:58:54.333 に答える
3
     SqlCommand cmd6 = new SqlCommand("SELECT * FROM tblinv WHERE invno='" + textBox5.Text + "'",cn);

        SqlDataReader sqlReader6 = cmd6.ExecuteReader();

        if (sqlReader6.HasRows)

        {
            DataTable dt = new DataTable();

            DataTable dt1 = new DataTable();

            dt.Load(sqlReader6);

            dt1 = dt.DefaultView.ToTable(true, "ChallanNo", "ProductName", "UoM", "Price", "Qty","Subtotal");

            dataGridView2.DataSource = dt1;
        }
于 2016-11-12T12:07:01.880 に答える