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.