将大量数据绑定到组合框?

Posted

技术标签:

【中文标题】将大量数据绑定到组合框?【英文标题】:Bind large number of data to a combobox? 【发布时间】:2013-05-21 12:31:25 【问题描述】:

我想在下拉列表中绑定员工列表,具有自动完成功能,以便用户可以搜索正确的名称。我使用RadComboBox

我有两个主要问题:

1- 关于5000 item.so 的列表太大了。所以在浏览器中绑定这么多数据使其挂起或者很慢。(性能问题)

根据 Telerik 文档

为 RadComboBox 设置数据源。使用 DataSourceID 或 DataSource 属性来执行此操作并设置 DataTextField 和 DataValueField 属性添加到数据源中的各个字段。 (请注意,使用 DataSource 时,您必须在每个 回发,在 Page_Init 中最方便。)设置 EnableAutomaticLoadOnDemand 为 true。

所以我每次都必须在Page_Init 中调用以下方法!!!

  protected void BindInnerInstructors()
    
        ddl_inner_sup.Items.Clear();
        ddl_inner_sup.DataSource = Utilities.GetAllInnerInstructors();
        ddl_inner_sup.DataValueField = "emp_num";
        ddl_inner_sup.DataTextField = "name";
        ddl_inner_sup.DataBind();
    

2- 尝试设置组合框的选择时,对象引用未设置为对象的实例。

我通过this解决了这个问题。


我有大约4 dropdowlists,但每个人都必须根据事件绑定,但我必须将它们全部绑定到page_init

我将不胜感激这个问题的详细答案。

【问题讨论】:

你可以在这里找到详细的答案:demos.telerik.com/aspnet-ajax/combobox/examples/loadondemand/… @YuriyRozhovetskiy:非常感谢,但我想知道组合框何时绑定,如果我希望组合框仅在特定事件中绑定数据以提高性能? 【参考方案1】:

我的公司也有类似的问题。我们最终使用了一个名为 Select2 的 jquery 对象,并且我们延迟加载列表。基本上我们在加载时只加载前 10 个左右,使其加载速度很快,如果用户向下滚动超过前 10 个,我们会加载下一个 10 个,依此类推。 Select2 有一个搜索功能,它会根据搜索结果访问服务器以返回自定义列表。

一次加载 5000 个元素的问题是浏览器将永远加载它们,遍历它们,并根据需要操作它们。我不是说“你必须使用 select2” RadComboBox 可能有类似的东西你可以使用。

祝你好运。

【讨论】:

你能给我一个.net中的示例代码吗?你如何对待这个控件? 不幸的是,我无法举个例子。在 .Net 中,您将创建一种方法来加载所需的数据。您需要对分页进行一些研究。这只是获取大型数据集并将其以较小的可管理块发送的想法。这些数据需要通过 javascript/jquery 加载。您需要创建一个事件,当用户滚动到列表底部时,它会加载下一页数据。如果有人搜索某物,那么您将需要另一个返回搜索数据的 .net 调用。 我通过一个小的谷歌搜索找到了这个。它可能有用。 telerik.com/community/code-library/aspnet-ajax/combobox/… 几天后回到这个问题,我记得我在工作中不得不处理这个问题时被问到的问题。问题是“我们如何期望最终用户滚动浏览 5000 个元素?” (我调整了数字以适应您的问题)。我们不得不重新考虑我们想要做什么。最终用户很可能不想滚动 5000 个元素来找到他们正在寻找的一两个元素。因此,当这个问题悬而未决时,您可能想重新考虑加载所有 5000,而是从不同的角度来解决这个问题。 就像一个带有客户最后搜索结果或其他内容的预加载列表。它的工作量更大,但更以最终用户为中心。祝你好运。【参考方案2】:

我不建议显示数据集,而是将其存储在 javascript 对象中。然后,您可以使用该对象列表进行自动完成。这是通过 jquery 完成的,使用选择器,然后使用它应用自动完成功能。

例子:

var systems = [t:"hi",s:"something".t:"hi",s:"something",t:"hi",s:"something"];
$("#s").autocomplete(systems, 

width: 300,
formatItem: function(item) 
 return item.t + item.s; ,
formatResult: function(item) 
 return item.t; 
);

【讨论】:

我想添加一条评论,formatItem 部分用于在您的下拉列表中,有一个格式化的字符串,如彩色跨度等或任何类型的 CSS/附加信息,但 formatitem 是什么将被存储在盒子中。【参考方案3】:

我也遇到过类似的情况,其中有大量的值绑定到下拉列表。最新版本的 chrome、firefox 和 IE 能够绑定它,但这也需要几分钟,但对于旧版本的脚本会挂起并且永远不会工作。

我们使用简单的方法,而不是使用任何自定义控件或 Telerik rad 框。 我们将 page-size 作为可配置值(比如 50)和 页码(默认 1)、页数(总计数/页大小) 和 搜索条件(用于自动完成的用户输入)作为服务返回值的参数,并根据输入搜索条件和页码仅获取等于页面大小的记录。

获取一个文本框并将此服务调用绑定到文本框的文本更改事件并将输出绑定到自动完成下拉列表。

分页和搜索的逻辑在Stored Procedure having Sorting, Paging and Filtering这样的存储过程中实现

这比任何客户端分页、绑定等都简单、快速且几乎可维护。

【讨论】:

【参考方案4】:

如果要显示大量项目,请使用 VirtualizingStackPanel 作为 RadComboBoxes 的 ItemsPanel。 使用 VirtualizingStackPanel,您可以在 RadComboBox 中拥有一万个项目。

使用此 XAML 代码:

            <!-- WPF ItemsControls like ComboBox, ListBox or Menu use a StackPanel as their internal layout panel. 
                 Use a VirtualizingStackPanel for performance. Else the Combobox will freeze!   -->
            <ItemsPanelTemplate x:Key="itemsPanelTemplate">
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>

            <!-- This style specifies how RadComboBoxes look like -->
            <Style TargetType="telerik:RadComboBox">
                <Setter Property="ItemsPanel" Value="StaticResource itemsPanelTemplate"/>
            </Style>

【讨论】:

【参考方案5】:

为简单起见,您只需添加前 15 个或 20 个名称,当用户在组合框上键入时,用从数据库返回的名称填充组合框,但不是全部,只用几个名称填充它,这样浏览器就不会挂起...

【讨论】:

【参考方案6】:

你可以做和谷歌一样的事情。当您在谷歌上写东西时,与您输入的文本不同的文本会消失,但相同的文本会保留在那里。这将使您的搜索更容易,这就是答案。

【讨论】:

以上是关于将大量数据绑定到组合框?的主要内容,如果未能解决你的问题,请参考以下文章

将枚举属性数据绑定到 WPF 中的组合框

将枚举属性数据绑定到 WPF 中的组合框

通过 vba ms 访问将多值列的数据绑定到组合框中

如何将数据源绑定到 datagridview 组合框和复选框

组合框绑定不更新

如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)