C# 当尝试设置组合框的选择时,对象引用未设置为对象的实例

C# 当尝试设置组合框的选择时,对象引用未设置为对象的实例,c#,asp.net,telerik,page-lifecycle,radcombobox,C#,Asp.net,Telerik,Page Lifecycle,Radcombobox,我有一个文本框和一个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"

我有一个
文本框
和一个
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>



我发现
rad\u ddl\u internal\u emp\u name.Items.Count=0
!!在设置选择之前!如何解决此问题?

由于在
rad\u ddl\u inner\u emp\u name.Items
中没有任何项,因此可以将
txt\u inner\u emp\u num.Text
设置为在ddl中选择的项


首先检查
rad\u ddl\u internal\u emp\u name.Items count>0
,然后将所需文本设置为选中。或者您可以检查
rad\u ddl\u inner\u emp\u name.Items.FindItemByValue(txt\u inner\u emp\u num.Text.TrimEnd())
是否不为空。

问题是,只有在您请求时才会加载项目

设置

EnableAutomaticLoadOnDemand=“False”

它会起作用的

更新:

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

EnableLoadOnDemand="True"
EnableItemCaching="True"
更新2:
启用ItemCaching是不必要的,但它不会造成伤害

除非禁用视图状态,否则不需要在每次回发时将数据绑定到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;
    }
}

受保护的无效页_Init(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
rad_ddl_internal_emp_name.DataSource=Utilities.GetAllEmployees();
rad_ddl_internal_emp_name.DataTextField=“name”;
rad_ddl_internal_emp_name.DataValueField=“emp_num”;
rad_ddl_internal_emp_name.DataBind();
}
}
受保护的void txt\u inner\u emp\u num\u TextChanged(对象发送方,事件参数e)
{
字符串值=txt\u inner\u emp\u num.Text;
如果(!string.IsNullOrWhiteSpace(值))
{
value=value.Trim();
if(rad_ddl_inner_emp_name.Items
.FindItemByValue(txt\u inner\u emp\u num.Text.Trim())!=null)
rad\u ddl\u internal\u emp\u name.SelectedValue=value;
}
}

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

我建议使用emp_num搜索第二个对象(假设该值始终输入文本框)

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

private Dictionary<string, string> Emp_Dict = new Dictionary<string, string>(); 
所以现在我们需要对文本更改事件使用字典

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()];
    }

}

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

我想问为什么一直
rad_ddl_inner_emp_name.Items.Count=0
但我想将此属性设置为“true”,当我将其设置为false时,页面会变得很重并且挂起,我有大约6000个项目,我不想每次都加载这么大的数量,我认为ItemsPerRequest属性只能与AutomaticLoadOnDemand结合使用,但我不是100%确定…无论如何,在telerik的这个演示中,您可以看到如何手动执行LoadOnDemand!
<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;
    }
}
private Dictionary<string, string> Emp_Dict = new Dictionary<string, string>(); 
    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()];
    }

}