C# 如何以表格形式/数据网格显示分层数据

C# 如何以表格形式/数据网格显示分层数据,c#,sql,datagrid,C#,Sql,Datagrid,我想显示一个网格,其中显示被邀请者的信息,还有——这是棘手的部分——列,指示他们收到了哪些邮件 例如,这样的网格: Firstname | Lastname | ReceivedMail1 | ReceivedMail2 Firstname | Lastname | ReceivedMail1 | ReceivedMail2 | ReceivedMail3 如果在应用程序中创建了第三封邮件,则网格需要添加如下列: Firstname | Lastname | ReceivedMail1 |

我想显示一个网格,其中显示被邀请者的信息,还有——这是棘手的部分——列,指示他们收到了哪些邮件

例如,这样的网格:

Firstname | Lastname | ReceivedMail1 | ReceivedMail2
Firstname | Lastname | ReceivedMail1 | ReceivedMail2 | ReceivedMail3
如果在应用程序中创建了第三封邮件,则网格需要添加如下列:

Firstname | Lastname | ReceivedMail1 | ReceivedMail2
Firstname | Lastname | ReceivedMail1 | ReceivedMail2 | ReceivedMail3
我的数据库是关系型的,所以有一些类似person.receivedEmails的东西,它包含一组电子邮件


我正在寻找一个最佳实践来解决这个问题。我在WinForms应用程序中使用C#,但我的Web应用程序也需要这个。我正在考虑一个动态对象(尽管我不确定它在网格中的效果如何),或者一个数据库视图。有什么建议吗?

好的,我就这样做。 感谢和

这是一个原型:

        dynamic obj = new ExpandoObject();
        obj.FirsName = "John";
        obj.LastName = "Doe";
        var x = obj as IDictionary<string, Object>;
        for (int i = 0; i < 3; i++)
        {
            x["ReceivedMail_" + i] = true;
        }

        var data = new List<ExpandoObject>() { obj };
        this.dataGridView1.DataSource = data.ToDataTable();
dynamic obj=new ExpandoObject();
obj.FirsName=“约翰”;
obj.LastName=“Doe”;
var x=作为索引的obj;
对于(int i=0;i<3;i++)
{
x[“接收邮件”+i]=真;
}
var data=newlist(){obj};
this.dataGridView1.DataSource=data.ToDataTable();
使用第二个链接中的方法:

    public static class DynamicIENumerableExtension
{
    public static DataTable ToDataTable(this IEnumerable<dynamic> items)
    {
        var data = items.ToArray();
        if (data.Count() == 0) return null;

        var dt = new DataTable();
        foreach (var key in ((IDictionary<string, object>)data[0]).Keys)
        {
            dt.Columns.Add(key);
        }
        foreach (var d in data)
        {
            dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
        }
        return dt;
    }
公共静态类DynamicEnumerableExtension
{
公共静态数据表到数据表(此IEnumerable items)
{
var data=items.ToArray();
if(data.Count()==0)返回null;
var dt=新数据表();
foreach(变量键入((IDictionary)数据[0]).Keys)
{
dt.Columns.Add(键);
}
foreach(数据中的var d)
{
Add(((IDictionary)d).Values.ToArray());
}
返回dt;
}
结果和我想要的完全一样。:)

现在考虑到这一点: