【问题标题】:How do I display my object's data in C#?如何在 C# 中显示对象的数据?
【发布时间】:2013-10-02 15:40:42
【问题描述】:

这是我的代码:

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、姓名、地址、年龄、日期 (空格)、姓名、地址、年龄、日期 (空格)、姓名、地址、年龄、日期 ID2、姓名、地址、年龄、日期 (空格)、姓名、地址、年龄、日期 (空格)、姓名、地址、年龄、日期

每家餐厅至少有 1 起投诉,有些餐厅可能会有很多投诉。但在所有情况下,我都希望餐厅的 ID 只显示一次(随之而来的投诉)。我过去对 DataGridView 的使用仅限于 dataGridView1.DataSource = (some array)。但是,这次我要呈现的信息显然不是数组,所以我卡住了。

 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 只显示一次?

【问题讨论】:

  • 每家餐厅的投诉最大数量是否已知(您希望在一行中显示)。
  • @Servy。不,我不知道提前投诉的最大数量。
  • @phan 是否可以将所有投诉的所有数据放在一个列中?您丢失了标题,但保留了信息。
  • @Ahmed 查看我添加的 LINQ 查询。
  • @Servy 数据必须在各自的列中分解,而不是全部集中在一个列中。

标签: c# winforms data-binding datagridview


【解决方案1】:

几乎在那里。您几乎完全拥有您想要的东西,并且正在适当的庄园中得到它,但您真正需要知道的是特定投诉是否是该列表中的第一项。获得它的方法是在从具有索引作为参数的complaints 中选择时使用Select 的重载。要做到这一点,您需要使用方法语法,而不是查询语法,这样就可以解释大部分更改。

一旦你有了该索引,调整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,
    }));

【讨论】:

  • 抱歉格式化。当我设置 dataGridView1.DataSource = data 时,什么都没有出现。但是当我单步执行代码并查看“数据”的内容时,它看起来就像我想要的那样(我展开了结果视图)。如何让数据显示在 DataGrid 控件中?我认为这与枚举 IEnumerable 有关,但老实说,我不知道这意味着什么。
  • @phan 我不知道你遇到了什么问题。正如您自己确认的那样,这是正确的数据,因此这听起来像是您的应用程序中的其他问题,可能与 DGV 的配置方式有关。无论如何,这是一个单独的问题。
  • 你是对的。我修好了我的 DGV,现在一切正常!谢谢!
  • 上面的代码可以使用OrderBy吗?我不知道在哪里插入 OrderBy 以便结果按餐厅 ID(升序)排序,然后按 Complaint.Name 和 Complaint.Date。
  • @phan 那时没有投诉名称;你说你只想根据餐厅的信息点餐。如果您想针对个别投诉点餐,但仅限在每家餐厅内点餐,您需要在致电Select 之前下单。
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多