2009-03-24 22 views
6

Wiążemy listę niestandardowych obiektów do DropDownList ASP.NET w C#, ale chcemy pozwolić, aby DropDownList nie miał niczego wybranego na początku. Jednym ze sposobów na zrobienie tego może być utworzenie pośredniej listy łańcuchów, wypełnienie pierwszej pustym łańcuchem, a następnie wypełnienie reszty listy niestandardowymi informacjami o obiekcie.Dodaj pusty element do listy rozwijanej niestandardowych obiektów w C#

Nie wydaje się to jednak zbyt eleganckie, czy ktoś ma lepszą sugestię?

Odpowiedz

23

Tak, tworzyć listy tak:

<asp:DropDownList ID="Whatever" runat="server" AppendDataBoundItems="True"> 
    <asp:ListItem Value="" Text="Select one..." /> 
</asp:DropDownList> 

(Uwaga wykorzystania AppendDataBoundItems="True")

A potem, gdy wiążą, związanego elementy są umieszczane po pustej pozycji zamiast zastępując to.

+0

Wow, co za proste zadanie – Sauron

+0

Proste, gdy je znasz. Dzięki, Sean. Dar, który ciągle daje. :) – BobRodes

11

Można dodać do z danymi imprezy:

protected void DropDownList1_DataBound(object sender, EventArgs e) 
     { 
      DropDownList1.Items.Insert(0,new ListItem("","")); 
     } 
+0

prawie tak jak robiłem to od lat, czy nawet w DataBound, ale zawsze po ustawieniu DataSource +1 –

2

Właśnie nad tym pracuje właściwie, oto co mam do tej pory (wraz z dodatkami para Databinding)

public interface ICanBindToObjectsKeyValuePair { 
    void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO> bindableEnumerable, Expression<Func<TYPE_TO_BIND_TO, object>> textProperty, Expression<Func<TYPE_TO_BIND_TO, object>> valueProperty); 
} 

public class EasyBinderDropDown : DropDownList, ICanBindToObjectsKeyValuePair { 
    public EasyBinderDropDown() { 
     base.AppendDataBoundItems = true; 
    } 
    public void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO> bindableEnumerable, 
     Expression<Func<TYPE_TO_BIND_TO, object>> textProperty, Expression<Func<TYPE_TO_BIND_TO, object>> valueProperty) { 
     if (ShowSelectionPrompt) 
      Items.Add(new ListItem(SelectionPromptText, SelectionPromptValue)); 
     base.DataTextField = textProperty.MemberName(); 
     base.DataValueField = valueProperty.MemberName(); 
     base.DataSource = bindableEnumerable; 
     base.DataBind(); 
    } 
    public bool ShowSelectionPrompt { get; set; } 
    public string SelectionPromptText { get; set; } 
    public string SelectionPromptValue { get; set; } 
    public virtual IEnumerable<ListItem> ListItems { 
     get { return Items.Cast<ListItem>(); } 
    } 
} 

Zawiadomienie jedna rzecz, która można zrobić, to

dropDown.BindToProperties(myCustomers, c=>c.CustomerName, c=>c.Id); 
1

pierwsze:

DropDownList1.Items.Clear();

Następnie dodaj elementy listItems do listy dropDownList.

Zapobiega to uzyskiwaniu przez dropDownList coraz większej listy elementów za każdym razem, gdy jest renderowana w odświeżeniu wstecznym lub asynchronicznym oddzwonieniu.

+0

To tak naprawdę nie odpowiada na pytanie, ale +1, ponieważ kiedy dopiero zacząłem z ASP .NET, musiałem to wiedzieć źle, hehe :) Zajęło mi to kilka godzin, aby to rozgryźć. – SirDemon

Powiązane problemy