Шаблоны условных элементов с RadComboBox - PullRequest
1 голос
/ 23 декабря 2009

У меня есть 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>

Мой вопрос такой. Я хочу добавить начальный элемент в список, который предназначен для «Все отделы» и является элементом по умолчанию. Я могу сделать это легко, но проблема у меня заключается в том, что, поскольку я не сохраняю запись «Все отделы» в базе данных, шаблон показывает пустое пространство в начале списка элементов, когда вы опускаете поле со списком. , Я пытаюсь выяснить, есть ли способ шаблонирования всех элементов, кроме первого в списке?

Примечание: я также попытался выполнить условие в 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-форматирования.

1 Ответ

1 голос
/ 13 января 2010

Вы можете определить 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();
        }
    }
}

Надеюсь, это поможет!

...