Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Honza Šotola

nepravidelné poznámky .NET vývojáře

Jak přidat do asp:DropDownList položku, která není v datasource

Možná zase objevuji Ameriku, ale následující feature jsem neznal.

Jistě jste v různých projektech řešili následující problém:

  • mám DropDownList a používám ho např. pro filtrování
  • jeho položky plním z nějakého číselníku, ale navíc bych chtěl mít na prvním místě nějakou neutrální hodnotu, která znamená "hledej vše"

Pokud DropDownList bindujete "postatu", tedy vytvořením data source objektu v code-behind, jeho dosazení do property DataSource a následné volání metody DataBind(), mohli jste položku ještě před nabindováním přidat do původního datasource.

Pokud ale máte data source deklarovaný v ASPX kódu stránky, taková možnost se nenaskytuje.
Naštěstí asp:DropDownList podporuje možnost kombinovat načtení položek z DataSource s nastavením statických položek. Tento režim se zapíná pomocí property AppendDataBoundItems na true.

Původní deklaraci DropDownListu, např.

<asp:DropDownList ID="ddlCountry" runat="server" DataSourceID="dsCountry" DataValueField="ID" DataTextField="Name" />

tedy doplníte o nastavení této property a přidáte statickou položku (ta se předřadí před položky z datasource a bude tedy i implicitně selectnutá):

<asp:DropDownList ID="ddlCountry" runat="server" AppendDataBoundItems="true" DataSourceID="dsCountry" DataValueField="ID" DataTextField="Name" >
  
<asp:ListItem Value="0" Text="-all-" />
</
asp:DropDownList>

Tolik ke klasickému asp:DropDownListu ze System.Web.UI.

A jak to řešit v DevExpress ASPxComboBoxu:

ASPxComboBox bohužel property AppendDataBoundItems nepodporuje (přestože už dva roky existuje suggestion pro přidání této property).
Většina diskusí na jejich support fóru vede k článku, který radí item přidávat dynamicky až na klientské straně.
Kód pro deklaraci ComboBoxu pak vypadá následovně:

<dx:ASPxComboBox ID="cmbRealm" runat="server" DataSourceID="dsRealm" ValueField="ID" TextField="ID">
  
<ClientSideEvents Init = "function(s, e) {if (s.GetItemCount() <= 0 || s.GetItem(0).value != '') {s.InsertItem(0, '-', '');s.SetSelectedIndex(0);}}"/>
</
dx:ASPxComboBox>

Není to nic nádherného, ale lepší řešení jsem zatím nenašel.

Published 20. října 2010 11:40 by honzas
Filed under: ,

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Lukyn said:

Ahoj když mám dropdownlist a chci si vybrat třeba jméno které ma id 1. Tak jak z dropdownlist  dostanu hodnotu toho id. Když jí chci požit na uložení do DB.

prosince 18, 2011 16:00

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server (Personal Edition), by Telligent Systems