如何仅使用自定义对象显示DataGridView中的某些列

Cri*_*jon 16 c# datagridview

我有一个DataGridView,我需要添加自定义对象.请考虑以下代码:

DataGridView grid = new DataGridView();
grid.DataSource = objects;
Run Code Online (Sandbox Code Playgroud)

使用此代码,我得到一个DataGridView对象,其所有属性都是列.就我而言,我不想展示所有这些信息; 我想只展示两三列.我知道我可以设置

AutoGenerateColumns = false.

但我不知道如何继续进行.一种选择是隐藏所有我不感兴趣的列,但我认为最好以相反的方式进行.我怎样才能做到这一点?

nic*_*k_w 27

每当我这样做时,我通常会grid.DataSource在对象上生成LINQ投影的结果.

所以像这样:

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

好的是,您可以设置AutoGenerateColumns为true,这将根据投影对象的属性生成列.

编辑:

这种方法的一个缺点是,通过将所有内容投射到匿名对象中,例如,在需要访问单击事件中的特定对象的情况下,您可能会遇到问题.

在这种情况下,您最好定义一个显式视图模型并将对象投影到这些模型中.例如,

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();
Run Code Online (Sandbox Code Playgroud)

编辑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();
Run Code Online (Sandbox Code Playgroud)

我之所以选择getter方法来检索底层模型对象,只是为了避免为它生成一个列.


Joh*_*ohn 10

您也可以在底层对象的任何属性上使用Attribute [Browsable(false)],这可能是合适的.这当然会阻止列在其他地方可浏览,所以你可能会发现这是不合需要的.


Ale*_*Río 10

您可以AutoGenerateColumns = false像这样使用数据绑定和使用DataPropertyName

grid.Columns["Column_name_1"].DataPropertyName = "public_property_1";
grid.Columns["Column_name_2"].DataPropertyName = "public_property_2";
Run Code Online (Sandbox Code Playgroud)

这样,只有绑定列才会显示在datagridview中,您可以根据需要在编辑器中创建列.公共属性可以是对象中的任何公共属性.

如果要从datagridview编辑数据,则应在set方法中使用NotifyPropertyChanged.请问我的问题/答案哪里我一直向下解释.


Suj*_*H S 5

你可以做这样的事情。

要首先仅显示特定列,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();
Run Code Online (Sandbox Code Playgroud)

我知道这是一个漫长的过程,那些追求表演的人可能不喜欢这样。:P

但我认为效果很好。


Ahm*_*ğur 5

这是我的旧项目代码.它可以适用于您的情况.

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";
Run Code Online (Sandbox Code Playgroud)

  • dataGridView1.AutoGenerateColumns = false; 防止所有列显示在数据绑定上。谢谢! (2认同)

mat*_*tec 5

最简单的方法是将“ System.ComponentModel.Browsable”属性添加到您的DataModel中:

public class TheDataModel 
{
       [System.ComponentModel.Browsable(false)]
       public virtual int ID { get; protected set; }
       public virtual string FileName { get; set; }
       [System.ComponentModel.Browsable(false)]
       public virtual string ColumnNotShown1 { get; set; }
       [System.ComponentModel.Browsable(false)]
       public virtual string ColumnNotShown2  { get; set; }
}
Run Code Online (Sandbox Code Playgroud)