2009-12-22 6 views
1

J'ai un RadComboBox que j'utilise pour afficher le nom du département et les abréviations. J'utilise un modèle d'élément avec un LinqDataSource pour faire de chaque élément apparaissent comme:Modèles d'éléments conditionnels avec RadComboBox

DeptAbbr - (DEPTNAME)

Voici le code que je utilise pour ce faire et il fonctionne très bien:

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

Ma question est la suivante. Je veux ajouter un élément initial dans la liste pour "Tous les départements" et est l'élément par défaut. Je peux le faire facilement, mais le problème que j'ai est que parce que je ne stocke pas une entrée "Tous les départements" dans la base de données, le modèle affiche un espace vide au début de la liste des éléments lorsque vous descendez la zone de liste déroulante . J'essaie de savoir s'il y a moyen de modéliser tout sauf le premier élément de la liste? J'espère que cela a du sens. Toute aide est grandement appréciée.

Note: J'ai aussi essayé de faire une condition dans la Eval comme ceci:

<b><%# (Eval("DepartmentAbbr") != null) ? Eval("DepartmentAbbr") : "All Departments" %></b><%# Eval("DepartmentName", " - ({0})") %> 

Mais il évalue seulement sur les éléments qui sont databound et non l'élément initial que je suis planté dans la main. Autrement dit, si je change la déclaration ci-dessus sont:

<b><%# (Eval("DepartmentAbbr") == null) ? Eval("DepartmentAbbr") : "All Departments" %></b><%# Eval("DepartmentName", " - ({0})") %> 

Puis-je obtenir juste une liste avec un élément vide en haut et le reste de lecture « Tous les ministères ». Mon travail autour de ce problème a été de faire des trucs de sélection funky avec le côté serveur LINQ, mais cela m'a forcé à me débarrasser de tous les modèles et le formatage html qui craint vraiment parce que je veux qu'il soit joli :) hehe .

Répondre

1

Vous pouvez définir le RadComboBoxItem 'Tous les rayons' comme un élément statique dans la collection <Items>. Puisque vous avez activé la propriété AppendDataBoundItems, vous ne voulez pas vous lier à votre source de données tant que le contrôle n'a pas déjà lié les éléments statiques; sinon, vous obtiendrez l'espace vide que vous voyez en développant la zone de liste déroulante. En outre, utilisez DataBinder.Eval(Container, "Text") pour afficher le champ DepartmentAbbr. Puisque vous avez défini ce champ comme DataTextField pour le contrôle, cette valeur sera toujours affichée. Si ce n'est pas le cas, vous récupérez l'espace vide lorsque le contrôle se lie à l'élément statique, car il ne sait pas ce qu'est DepartmentAbbr; il a seulement un champ de texte. Voici un exemple pour démarrer:

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

Espérons que ça aide!