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