Шаблоны условных элементов с RadComboBox

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


person sanpaco    schedule 22.12.2009    source источник


Ответы (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();
        }
    }
}

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

person Kevin Babcock    schedule 13.01.2010