【问题标题】:Bind a datagridviewcolumn to a nested class将 datagridviewcolumn 绑定到嵌套类
【发布时间】:2017-11-22 15:43:49
【问题描述】:

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

由于可能有很多行,我想进行绑定以快速填充 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);

【问题讨论】:

  • wpf的winforms?
  • 您能否发布一些 XAML 代码或您如何创建 datagridview?
  • 您在评论中说... ”每个组合框单元格包含 1 到 4 个房间项目。但是可以有很多行。”...如果是这种情况,那么发布的类Data 不仅似乎缺少Room 值变量,而且对于@987654326 来说似乎很尴尬@object 包含多个 Room 附加到该对象的值。由于这些 MULTIPLE Room 值用于网格中的 ComboBox 单元格,因此每行的 Data 对象似乎只需要一 (1) 个值。????
  • 示例 1) 如果组合框列表包含“Room1”、“Room2”和“Room3”……Data 对象将用户选择的内容保存在哪里?如果组合框包含上述值……您将这个值放在Data 对象的哪个位置以显示用户选择的Room
  • 示例 2) 每行在组合框中可能有不同的值,但是,在填充网格后,每行组合框单元格将仅显示组合框中的一 (1) 个值。鉴于此,Data 类似乎缺少该Data 对象的选定Room 值。同样如上所述,让每个Data 对象包含它永远不会使用的值似乎很尴尬……即其List&lt;Room&gt; _rooms_list 中的值不是由用户选择的。

标签: c# data-binding datagridview datagridviewcombobox


【解决方案1】:

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

编辑:如果您只使用网格进行显示,您可以通过简单地将房间显示为文本而不是组合框来提高性能。然后,您可以通过更改字体样式(例如粗体)或颜色,或添加一些符号(例如星号)或单词(例如 [selected])来表示选定的房间。用新线分隔每个房间。这是一个示例函数,但我不知道您的房间是如何选择的,所以假设您的 bool Selected { get; set; } 类中有一个 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: 如果您允许用户从可用房间列表中选择一个房间,并且此列表各行不同,那么我们通常使用组合框用于该目的。但是,如果您有很多行,那么加载就像您遇到的那样需要更长的时间。

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

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

【讨论】:

  • 每个组合框单元格包含 1 到 4 个房间项目。但是可以有很多行。
  • 你的意思是组合中的值不一样?它不像一个可供选择的选项列表吗?从您的评论看来,它似乎是选定值的列表。如果是,这些值是从哪里来的?
  • 不,这些值是 Room 实例。我事先不知道哪些房间将与每一行相关联。这个 DGV 是为了展示结果。
  • 哦,我明白了。你应该在你的问题中提到这一点。我以为网格是用来编辑的。既然它只是为了显示,你为什么要使用组合框?您可以简单地将房间列表显示为文本。您可以通过更改字体样式(例如粗体)或颜色,或添加一些符号(例如星号)或单词(例如 [selected])来表示选定的房间。用新线分隔每个房间。我将编辑我的答案。
  • 对不起,我不够清楚,网格是为了显示结果并让用户为每一行选择所需的房间。也许有更好的方法来做到这一点,没有组合框......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多