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

时间:2013-03-05 12:51:42

标签: c# asp.net telerik page-lifecycle radcombobox

我有text boxRadComboBox这样:

<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 Documentation

  

将数据源设置为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 个答案:

答案 0 :(得分:4)

正如我现在确定你知道的那样,radcombox预先输入功能通过客户端交互而非值来搜索文本,这就是你无法找到值的原因。

我建议有一个辅助对象按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将会更新。

答案 1 :(得分:2)

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

设置

EnableAutomaticLoadOnDemand="False"

它会起作用!

更新:

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

EnableLoadOnDemand="True"
EnableItemCaching="True"

更新2: 启用ItemCaching不是必需的,但它不会受到伤害!

答案 2 :(得分:1)

由于rad_ddl_inner_emp_name.Items中没有任何项目,因此您可以在ddl中设置txt_inner_emp_num.Text

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

答案 3 :(得分:1)

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

过滤器,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;
    }
}