将datagridviewcolumn绑定到嵌套类

时间:2017-06-20 08:03:20

标签: c# data-binding datagridview datagridviewcombobox

在我的C#程序中,我有一个包含datagridview的Windows窗体(Winforms)。这个datagridview的最后一列是datagridviewcomboboxcolumn,每个组合单元(每行)都有自己的数据源。

由于可能有很多行,我想创建一个绑定来快速填充datagridview。我已经尝试绑定第一列然后填充组合框的数据源(在RowsAdded事件中),但这需要花费太多时间。

我的班级数据如下:

public class Data
    {
        public string _aaa { get; private set; }

        public string _bbb { get; private set; }

        public string _ccc { get; private set; }

        public List<Room> _rooms_list { get; private set; }
...
}

Room类包含以下成员:

public ElementId Id { get; }
public virtual string Name { get; set; }

当datagridview的数据源绑定到Data对象列表时,我希望相应的comboboxcell填充相应的Room对象列表,Name为DisplayMember,Id为ValueMember。

我在网上搜索但是如果可能或没有找到答案。

非常感谢你的帮助。

修改

更多信息:我想让用户在检测到的/找到的房间列表中选择所需的房间,这就是我选择组合框的原因。我的计算结果已经显示为两个(绑定)字符串列中的字符串。

我也希望整个事情可以排序,所以我使用SortableBindingList将DGV与Data对象列表绑定:mainDataGridView.DataSource = new SortableBindingList<Data>(_data);

1 个答案:

答案 0 :(得分:0)

如果您的列表中有许多房间,那么为您已经体验过的每个单元格创建一个新的组合框会很慢。我建议在代码中创建一个组合框,然后将其添加到每个单元格中。

修改:如果您仅使用网格进行显示,则只需将房间显示为文本而不是组合框,即可提升性能。然后,您可以通过更改字体样式(例如粗体)或颜色,或通过添加某些符号(例如星号)或单词(例如[选定])来表示所选房间。用新线分隔每个房间。这是一个示例功能,但我不知道您的房间是如何被选中的,所以我们假设您的bool Selected { get; set; }课程中有Room

string ListRooms(List<Room> rooms){
    string result = "";
    foreach(Room r in rooms){
        result += r.Selected ? "* " : "";
        result += r.Name + "\r\n";
    }
    return result;
}

现在在OnRowsAdded事件中,您可以调用此函数并在简单的文本单元格中显示结果。

编辑2 :如果您允许用户从可用房间列表中选择一个房间,并且此列表从一行到另一行不同,则组合框是什么我们通常用于此目的。但是,如果您有很多行,则需要更长时间才能加载,就像您正在体验一样。

在这种情况下,您最好的选择是不要在开头加载组合框。将它们留空,当用户单击组合框以选择房间时,使用Ajax从服务器获取该行的房间列表,并使用JavaScript填充组合框。此解决方案将表现良好,但如果用户必须为所有行选择一个房间,页面可能会变得有点沉重。我相信所有现代浏览器仍然能够顺利处理它,但如果您的用户在移动设备上使用您的网络应用程序,它可能会成为问题。

或者,您可以使用弹出窗口而不是组合框。用按钮或链接替换组合框。他们可以阅读像#34;选择一个房间&#34;。当用户单击按钮/链接时,使用Ajax加载弹出窗口,其中包含该行的可用房间列表。用户从列表中选择一个房间,然后单击按钮关闭弹出窗口,然后使用JavaScript在用于打开弹出窗口的按钮/链接上显示选择房间,或者在所选房间的单独列中显示最初可以是空白的。这个解决方案更容易实现(您可以使用jQuery或Bootstrap),更灵活(您可以在弹出窗口中显示您想要的任何内容),并且无论行数如何都可以完美地执行。