在我的C#程序中,我有一个包含数据视图的窗口表单(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; }
...
}会议室课程由下列成员组成:
public ElementId Id { get; }
public virtual string Name { get; set; }当datagridview的数据源绑定到数据对象列表时,我希望相应的comboboxcell填充相应的Room对象列表,名称为DisplayMember,Id为ValueMember。
我在网上搜索,但没有找到答案,如果可能的话。
非常感谢你的帮助。
编辑
更多信息:我想让用户在检测到的/找到的房间列表中选择所需的Room,这就是我选择组合框的原因。我的计算结果已经在两个(绑定)字符串列中显示为字符串。
我也想使整个事情是可排序的,所以我使用一个SortableBindingList将DGV绑定到数据对象的列表:mainDataGridView.DataSource = new SortableBindingList<Data>(_data);。
发布于 2017-06-20 08:09:54
如果您的列表中有许多房间,那么为每个单元格创建一个新的组合框将是缓慢的,因为您已经在体验。我建议在代码中创建一个组合框,然后将其添加到每个单元格中。
编辑:如果您只使用网格显示,您可以通过简单地将房间显示为文本而不是组合框来提高性能。然后,您可以通过更改字体样式(例如粗体)或颜色,或者添加一些符号(例如星号)或单词(例如选定的)来表示选定的房间。用新的线条把每个房间隔开。下面是一个示例函数,但我不知道如何选择您的房间,所以让我们假设您的Room类中有一个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填充组合框。这个解决方案的性能会很好,但是如果用户必须为所有行选择一个空间,那么页面可能会变得有点沉重。我相信所有的现代浏览器仍然能够顺利地处理它,但是如果你的用户在移动设备上使用你的web应用程序,它可能会变成和发布。
或者,您可以使用弹出窗口而不是组合框。用按钮或链接替换组合框。他们可以读到“选择房间”之类的东西。当用户单击按钮/链接时,使用Ajax加载带有该行可用房间列表的弹出窗口。用户从列表中选择一个房间,然后单击按钮关闭弹出窗口,然后使用JavaScript在用于打开弹出窗口的按钮/链接上显示选择房间,或者在一个单独的列中显示所选房间,这些房间最初可以是空白的。这个解决方案更容易实现(您可以使用jQuery或Bootstrap),更灵活(您可以在弹出窗口上显示您想要的任何内容),并且无论行数如何都能很好地执行。
https://stackoverflow.com/questions/44647259
复制相似问题