如何在C#中显示对象的数据?

时间:2013-10-02 15:40:43

标签: c# winforms data-binding datagridview

这是我的代码:

void Main() {
    List<Restaurant> RestaurantData = new List<Restaurant>();
}

class Restaurant {
    public int Id;
    public List<Complaint> Complaints = new List<Complaints>();
}

class Complaint {
    public string Name;
    public string Address;
    public int Age;
    public DateTime ComplaintDate;
}

我想在DataGridView控件中显示RestaurantData中包含的数据。首先,我想显示餐馆的ID,然后是餐厅投诉的数量,以便它看起来像这样(ID在A栏中,名称在B栏,等等):

ID1, Name, Address, Age, Date
(space), Name, Address, Age, Date
(space), Name, Address, Age, Date
ID2, Name, Address, Age, Date
(space), Name, Address, Age, Date
(space), Name, Address, Age, Date

每家餐馆至少有1起投诉,有些餐馆可能有很多投诉。但在所有情况下,我都希望餐馆的ID只出现一次(随后会有投诉)。我以前对DataGridView的使用仅限于dataGridView1.DataSource =(某些数组)。但是,这次我要呈现的信息显然不是一个数组,所以我被卡住了。

 var ds = (from r in RestaurantData
           from c in RestaurantData.Complaint
           select new {Id = r.Id, Address =c.Address, Age = c.Age, Name = c.Name, Date = c.ComplaintDate}
             ).ToList();

    dataGridView1.DataSource = ds;

目前,这会用相应的餐厅ID填充每一行。如何调整上述查询,使餐厅ID仅显示一次?

1 个答案:

答案 0 :(得分:2)

几乎那里。你几乎完全符合你想要的,并且正在以适当的方式获得它,但你真正需要知道的是,如果一个特定的投诉是该列表中的第一项。得到这种方法的方法是从Select中选择具有索引作为参数的complaints重载。要做到这一点,您需要使用方法语法,而不是查询语法,以便占据大部分更改。

一旦你有了这个索引调整ID是一个非常简单的检查。

var data = restaurantData.SelectMany(restaurant =>
    restaurant.Complaints.Select((complaint, index) => new
    {
        ID = index == 0 ? restaurant.Id.ToString() : "",
        complaint.Name,
        complaint.Address,
        complaint.Age,
        Date = complaint.ComplaintDate,
    }));
相关问题