0

我想显示一个网格,其中显示受邀者信息和 - 这是棘手的部分 - 指示他们已收到哪些邮件的列。

例如,像这样的网格:

Firstname | Lastname | ReceivedMail1 | ReceivedMail2

如果在应用程序中创建了第三封邮件,我需要在网格中添加这样的列:

Firstname | Lastname | ReceivedMail1 | ReceivedMail2 | ReceivedMail3

我的数据库是关系型的,所以有一些类似于 person.receivedEmails 的电子邮件集合。

我正在寻找一个最佳实践来解决这个问题。我在 WinForms 应用程序中使用 C# 工作,但我的 web 应用程序也需要它。我正在考虑一个动态对象(虽然我不确定它与网格有多好),或者可能是一个数据库视图。有什么建议么?

4

1 回答 1

0

好的,这就是我要这样做的方式。感谢Adding-properties-To-ExpandoObjectsBinding-ExpandoObjects-ToDatagrid

这是一个原型:

        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();

使用第二个链接中的该方法:

    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;
    }

结果和我想要的完全一样。:)

结果

于 2012-10-14T13:28:48.117 回答