如何以编程方式将带有数据源的RadComboBox设置为AutomaticLoadOnDemand

问题描述 投票:0回答:4

我正在使用

RadComboBox
。在我的代码中,我将所选值设置为
RadComboBox
,如下所示:

public void RCB_PO_NUM_DataBound(object sender, EventArgs e)
        {

            var itemRCB_PO_NUM = RCB_PO_NUM.FindItemByText(stringPO_NUM);

            itemRCB_PO_NUM.Selected = true;
            itemRCB_PO_NUM.Value = stringPO_NUM;


        }

我正在从数据库中选择一个数字列表,并将它们显示在

RadComboBox
中。所以我必须使用
DataBound
事件来获取数据。

在我将

AutomaticLoadOnDemand
属性设置为 true 之前,效果很好。一旦这样做,我就可以通过
AutomaticLoadOnDemand
属性获得所需的效果,然后失去将
RadComboBox
设置为选定值的能力。

我需要能够做到这两点,

AutomaticLoadOnDemand
确实有助于加载
RadComboBox
中的项目,加载速度非常快。该代码不必位于
DataBound
事件中。我真的不在乎它发生在什么事件中,只要两者都能工作就行。有人可以告诉我用什么方法将
AutomaticLoadOnDemand
属性设置为 true,或者我做错了什么吗?

c# asp.net telerik radcombobox rad-controls
4个回答
2
投票

当您使用 LoadOnDemand 时,您的组合框不会被绑定,直到用户尝试展开它。所以你不能使用DataBound事件。

我不确定您的用例是什么。如果您只想向用户显示所选项目,那么您可以在 Page_Load 事件中尝试组合框的 Text 属性。

protected void Page_Load(object sender, EventArgs e)
{
    itemRCB_PO_NUM.Text = stringPO_NUM;
}

如果您确实需要选定的项目,那么也许您可以添加单个项目服务器端(抱歉我现在无法测试它)

protected void Page_Load(object sender, EventArgs e)
{
    itemRCB_PO_NUM.Items.Add(new RadComboBoxItem()
    {
        Value = stringPO_NUM,
        Text= stringPO_NUM,
        Selected = true
    })
}

编辑: 我做了一些研究,看来 ItemDataBound 事件应该正确触发:

注意:当您在自动按需加载期间使用 DataSourceID 或 DataSource 属性绑定 RadComboBox 时,ItemDataBound 事件会正常触发,这意味着您可以使用它来更改 Item 的 Text 和 Value 属性,并根据数据项等

所以你可以尝试使用它:

protected void RadComboBox1_ItemDataBound(object o, RadComboBoxItemEventArgs e)
{ 
    DataRowView dataSourceRow = (DataRowView) e.Item.DataItem;  
    if(e.Item.Text == stringPO_NUM)
    {
        e.Item.Selected = true;
        e.Item.Value = stringPO_NUM;
    }
}

但令我怀疑的是,在您在评论中提供的屏幕上,我可以看到您的字符串 stringPO_NUM 具有空值。我认为这可能是 GetItemByText 不向您返回项目的原因。

如果您能具体说明为什么需要选择此项目,也会很有帮助。


1
投票

尝试使用控件的 OnClientLoad 事件和 JavaScript API 来选择一个项目:http://www.telerik.com/help/aspnet-ajax/combobox-client-side-radcombobox.html。将所需的文本存储在隐藏字段或全局 JS 变量中。

问题是在请求返回之前您根本没有这些物品,所以我不确定这是否有效。因此,您可以使用 OnClientItemsRequested http://www.telerik.com/help/aspnet-ajax/combobox-onclientitemsrequested.html 事件尝试相同的想法 - 查看具有所需文本的项目是否从服务器返回,并且选择它。


1
投票

正如其他人所说 - 启用 LoadOnDemand 后,服务器上没有组合框项目。 这就是为什么您不能使用 FindItemBy* 方法 - 它们将始终返回 NULL。

提供更多关于您到底想要实现什么目标的信息,我们可以提供帮助。

我猜您想用已有的文本预先填充组合框 - 为此,您最好使用客户端 API,例如在组合加载事件中,您可以调用 requestItems("your text", true) 方法,传递您已有的文本,组合将发出 ajax 请求,以获取由您作为参数传递的文本过滤的项目。


0
投票

您面临的问题源于这样一个事实:当

AutomaticLoadOnDemand
属性设置为 true 时,
RadComboBox
仅根据用户的请求延迟加载项目。这意味着在
DataBound
事件中设置所选值将不起作用,因为您尝试选择的项目可能尚未加载。

要解决此问题,您可以使用

ItemsRequested
事件而不是
DataBound
事件。每当
RadComboBox
需要加载更多项目时就会触发此事件。您可以使用此事件在加载之前手动选择所需的项目。以下是如何执行此操作的示例:

    public void RCB_PO_NUM_ItemsRequested(object sender, ItemsRequestedEventArgs e)
{
    var itemRCB_PO_NUM = RCB_PO_NUM.FindItemByText(stringPO_NUM);

    if (itemRCB_PO_NUM != null)
    {
        e.Items.Add(itemRCB_PO_NUM);
        e.EndRequests();
    }
}

在此代码中,当 RadComboBox 需要加载更多项目时,将调用 ItemsRequested 事件处理程序。然后它将找到具有指定文本 (stringPO_NUM) 的项目并将其添加到要加载的项目列表中。最后,它将调用 EndRequests() 方法来指示请求的项目已被处理。

© www.soinside.com 2019 - 2024. All rights reserved.