我有一个RadComboBox,用于显示部门名称和缩写。我正在使用带有LinqDataSource的项模板,使每个项目显示为:
DeptAbbr - (DeptName)
以下是我用来执行此操作的代码,它运行正常:
<telerik:RadComboBox ID="rcbDepartments" runat="server" AppendDataBoundItems="True"
OnInit="rcbDepartments_Init" DataTextField="DepartmentAbbr" AutoPostBack="True"
DataSourceID="ldsDepartments" DataValueField="DepartmentID" HighlightTemplatedItems="true"
NoWrap="true" Width="250px">
<ItemTemplate>
<div>
<b>
<%# Eval("DepartmentAbbr")%></b><%# Eval("DepartmentName", " - ({0})") %>
</div>
</ItemTemplate>
</telerik:RadComboBox>
我的问题是这个。我想在列表中添加一个“All Departments”的初始项,它是默认项。我可以很容易地做到这一点,但我遇到的问题是因为我没有在数据库中存储“所有部门”条目,当您下拉组合框时,模板在项目列表的开头显示一个空格。我试图找出是否有任何方法来模板列表中的第一个项目?
注意:我也试过在Eval中做一个像这样的条件:
<b><%# (Eval("DepartmentAbbr") != null) ? Eval("DepartmentAbbr") : "All Departments" %></b><%# Eval("DepartmentName", " - ({0})") %>
但它只评估数据绑定的项目,而不是我手动坚持的初始项目。换句话说,如果我将上述陈述改为:
<b><%# (Eval("DepartmentAbbr") == null) ? Eval("DepartmentAbbr") : "All Departments" %></b><%# Eval("DepartmentName", " - ({0})") %>
然后我得到一个列表,顶部有一个空白项目,其余部分是“所有部门”。
我解决这个问题的方法是使用LINQ服务器端做一些时髦的选择,但这迫使我摆脱所有的模板和HTML格式。
答案 0 :(得分:1)
您可以将“所有部门”RadComboBoxItem定义为<Items>
集合中的静态项目。由于您已启用AppendDataBoundItems属性,因此在控件已绑定静态项之前,您不希望绑定到数据源;否则你将获得扩展组合框时看到的空白区域。此外,使用DataBinder.Eval(Container, "Text")
呈现DepartmentAbbr字段。由于您已将此字段设置为控件的DataTextField
,因此该值将始终呈现。如果没有,当控件绑定到静态项时,您将再次获得空白区域,因为它不知道DepartmentAbbr是什么;它只有一个文本字段。这是一个让你前进的例子:
<telerik:RadComboBox ID="RadComboBox1" runat="server"
AppendDataBoundItems="True"
DataTextField="Abbr"
AutoPostBack="True"
DataValueField="DeptID"
HighlightTemplatedItems="true"
NoWrap="true"
Width="250px">
<Items>
<telerik:RadComboBoxItem runat="server" Text="All Departments" />
</Items>
<ItemTemplate>
<div>
<b><%# DataBinder.Eval(Container, "Text")%></b><%# Eval("Name", " - ({0})") %>
</div>
</ItemTemplate>
</telerik:RadComboBox>
public partial class _Default : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
RadComboBox1.Load += new EventHandler(RadComboBox1_Load);
}
protected void RadComboBox1_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Ensure the static items are already bound before assigning
// new data to the DataSource property
RadComboBox1.DataBind();
var departments = new[] {
new { DeptID = 1, Abbr = "ACME", Name = "ACME Corporation" },
new { DeptID = 2, Abbr = "MSFT", Name = "Microsoft Corporation" },
new { DeptID = 3, Abbr = "GOOG", Name = "Google, Inc" }
};
RadComboBox1.DataSource = departments;
RadComboBox1.DataBind();
}
}
}
希望有所帮助!