【问题标题】:Object reference not set to an instance of an object when tring to set the selection of a combo box尝试设置组合框的选择时,对象引用未设置为对象的实例
【发布时间】:2013-02-19 21:10:31
【问题描述】:

我有一个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 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 !!在设置选择之前!如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    我相信您现在已经知道,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 将更新。

    【讨论】:

      【解决方案2】:

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

      设置

      EnableAutomaticLoadOnDemand="False"

      它会起作用的!

      更新:

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

      EnableLoadOnDemand="True"
      EnableItemCaching="True"
      

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

      【讨论】:

      • 但我想将此属性设置为 'true' ,当我将其设置为 false 时,页面会变得如此沉重并挂断
      • 我有大约6000 项目,我不想每次都加载这么大的数字
      • 我认为 ItemsPerRequest 属性只能与 AutomaticLoadOnDemand 结合使用,但我不是 100% 确定...无论如何,在 Telerik 的这个演示中,您可以看到如何手动执行 LoadOnDemand! demos.telerik.com/aspnet-ajax/combobox/examples/…
      【解决方案3】:

      您不需要在每次回发时将数据绑定到 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;
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我一直想问为什么rad_ddl_inner_emp_name.Items.Count = 0
        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多