将 datagridviewcolumn 绑定到嵌套 class

Bind a datagridviewcolumn to a nested class

在我的 C# 程序中,我有一个包含数据网格视图的 windows 表单 (Winforms)。此 datagridview 的最后一列是 datagridviewcomboboxcolumn,每个 comboboxcell(在每一行中)都有自己的数据源。

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

我的class数据如下:

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

房间 class 包含以下成员:

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

当datagridview的datasource绑定了一个Data对象列表时,我想要对应的comboboxcell填充对应的Room对象列表,Name为DisplayMember,Id为ValueMember。

我在网上搜索过,但没有找到答案。

非常感谢您的帮助。

编辑

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

我还想让整个事情变得可排序,所以我使用 SortableBindingList 将 DGV 与数据对象列表绑定:mainDataGridView.DataSource = new SortableBindingList<Data>(_data);

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

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

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

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

编辑 2: 如果您允许用户 select 可用房间列表中的一个房间,并且此列表的每一行都不同, 那么组合框就是我们通常用于此目的的。但是,如果您有很多行,那么加载所需的时间就会更长。

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

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