1

我有一个 RadComboBox 用于显示部门名称和缩写。我正在使用带有 LinqDataSource 的项目模板来使每个项目显示为:

DeptAbbr -(部门名称)

这是我用来执行此操作的代码,它工作正常:

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

我的问题是这个。我想在“所有部门”的列表中添加一个初始项目,并且是默认项目。我可以轻松做到这一点,但我遇到的问题是,因为我没有在数据库中存储“所有部门”条目,所以当您下拉组合框时,模板会在项目列表的开头显示一个空格. 我试图找出是否有任何方法可以对列表中除第一项以外的所有内容进行模板化?

注意:我也尝试过像这样在 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 格式。

4

1 回答 1

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

希望有帮助!

于 2010-01-13T01:54:31.770 回答