3

我有一个text box和一个RadComboBox这样的:

<asp:TextBox ID="txt_inner_emp_num" runat="server" Width="60px" 
ontextchanged="txt_inner_emp_num_TextChanged" AutoPostBack="true"></asp:TextBox>
<telerik:RadComboBox ID="rad_ddl_inner_emp_name" runat="server" CausesValidation="False"
CollapseDelay="0" Culture="ar-EG" ExpandDelay="0" Filter="Contains" ItemsPerRequest="100"
MarkFirstMatch="true" Width="380px" EnableAutomaticLoadOnDemand="True" EmptyMessage="-emp name-" ShowMoreResultsBox="True" AutoPostBack="True">
</telerik:RadComboBox>

根据Telerik 文档

将数据源设置为 RadComboBox。使用 DataSourceID 或 DataSource 属性来执行此操作,并将 DataTextField 和 DataValueField 属性设置为数据源中的相应字段。(注意,当使用 DataSource 时,您必须在每次回发时设置该属性,最方便的是在 Page_Init 中。)将 EnableAutomaticLoadOnDemand 设置为 true。


 protected void BindEmployees()
        {

            rad_ddl_inner_emp_name.Items.Clear();
            rad_ddl_inner_emp_name.DataSource = Utilities.GetAllEmployees();
            rad_ddl_inner_emp_name.DataTextField = "name";
            rad_ddl_inner_emp_name.DataValueField = "emp_num";
            rad_ddl_inner_emp_name.DataBind();

        }

 protected void Page_Init(object sender, EventArgs e)
        {
            BindEmployees();
        }

 protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
        {
            rad_ddl_inner_emp_name.ClearSelection();
            rad_ddl_inner_emp_name.Items.FindItemByValue(txt_inner_emp_num.Text.TrimEnd()).Selected = true;//Get exception here Object reference not set to an instance of an object.
        }

我发现rad_ddl_inner_emp_name.Items.Count = 0!!在设置选择之前!如何解决这个问题?

4

4 回答 4

4

我相信您现在已经知道,radcombox typeahead 功能通过客户端交互而不是按值搜索文本,这就是您找不到值的原因。

我建议通过 emp_num 搜索一个辅助对象(假设这是始终输入到文本框中的值)。

例如,创建一个全局变量:

private Dictionary<string, string> Emp_Dict = new Dictionary<string, string>(); 

然后在您进行绑定时填充此字典。以下代码假定返回一个可枚举的类型。如果不是,您可能必须以不同的方式填充字典。此外,要使其正常工作,您必须包含 (System.Linq)。

    var dataSource = Utilities.GetAllEmployees();
    Emp_Dict = dataSource.ToDictionary(ex => ex.emp_num, ex => ex.name);
    rad_ddl_inner_emp_name.Items.Clear();
    rad_ddl_inner_emp_name.DataSource = dataSource;
    rad_ddl_inner_emp_name.DataTextField = "name";
    rad_ddl_inner_emp_name.DataValueField = "emp_num";
    rad_ddl_inner_emp_name.DataBind();

所以现在我们需要在文本更改事件上使用字典。

protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
{
    rad_ddl_inner_emp_name.ClearSelection();
    if (Emp_Dict.ContainsKey(txt_inner_emp_num.Text.TrimEnd()))
    {
        rad_ddl_inner_emp_name.SelectedValue = txt_inner_emp_num.Text.TrimEnd();
        rad_ddl_inner_emp_name.Text = Emp_Dict[txt_inner_emp_num.Text.TrimEnd()];
    }

}

现在,当文本框中的文本发生更改时,当在文本框中输入有效的 emp_num 时,radcombobox 将更新。

于 2013-03-12T12:45:58.787 回答
2

问题是项目仅在您请求时才被加载!

EnableAutomaticLoadOnDemand="False"

它会起作用的!

更新:

如果要使用 LoadOnDemand 设置这两个属性并删除 EnableAutomicLoadOnDemand!

EnableLoadOnDemand="True"
EnableItemCaching="True"

更新 2:启用 ItemCaching 不是必需的,但它没有伤害!

于 2013-03-05T13:10:16.730 回答
1

由于您没有任何项目,rad_ddl_inner_emp_name.Items您可以txt_inner_emp_num.Text在 ddl 中设置为已选择。

首先检查是否rad_ddl_inner_emp_name.Items count > 0然后设置选择的所需文本。或者您可以检查是否rad_ddl_inner_emp_name.Items.FindItemByValue(txt_inner_emp_num.Text.TrimEnd())不为空。

于 2013-03-05T13:04:25.900 回答
1

除非禁用视图状态,否则无需在每次回发时将数据绑定到 RadComboBox。

Filter、MarkFirstMatch 和 EnableAutomaticLoadOnDemand 在您的情况下没有用,因为您自己加载所有员工。

LoadOnDemand 基本上是当用户开始在 ComboBox 内输入时,ComboBox 触发 ItemsRequested 事件并通过 ajax 检索数据。

<asp:TextBox ID="txt_inner_emp_num" runat="server" Width="60px" 
ontextchanged="txt_inner_emp_num_TextChanged" AutoPostBack="true" />

<telerik:RadComboBox ID="rad_ddl_inner_emp_name" runat="server" 
   CausesValidation="False" Culture="ar-EG">
</telerik:RadComboBox>

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        rad_ddl_inner_emp_name.DataSource = Utilities.GetAllEmployees();
        rad_ddl_inner_emp_name.DataTextField = "name";
        rad_ddl_inner_emp_name.DataValueField = "emp_num";
        rad_ddl_inner_emp_name.DataBind();
    }
}
protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
{
    string value = txt_inner_emp_num.Text;
    if(!string.IsNullOrWhiteSpace(value))
    {
        value = value.Trim();
        if (rad_ddl_inner_emp_name.Items
            .FindItemByValue(txt_inner_emp_num.Text.Trim()) != null)
            rad_ddl_inner_emp_name.SelectedValue = value;
    }
}
于 2013-03-05T18:40:27.077 回答