我有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>
将数据源设置为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
!!在设定选择之前!如何解决这个问题?
答案 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;
}
}