2009-03-24 12 views
6

Özel nesnelerin bir listesini C# içindeki bir ASP.NET DropDownList öğesine bağlıyoruz ancak DropDownList öğesinin başlangıçta seçili bir öğeye sahip olmamasına izin vermek istiyoruz. Bunu yapmanın bir yolu, bir dizelerin ara listesini oluşturmak, ilkini boş bir dizeyle doldurmak ve listenin geri kalanını özel nesne bilgisi ile doldurmak olabilir.C# içinde özel nesneler için açılan listeye boş öğe ekle # C#

Bu çok şık görünmüyor, kimse daha iyi bir öneriye sahip mi? şöyle

cevap

23

Evet, oluşturabilir, liste:

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

(AppendDataBoundItems="True" kullanımına dikkat)

Ve bağlamak zaman sonra, bağlı ürün değiştirmek yerine boş öğeden sonra konur o.

Sen veri sınırlama etkinliğe ekleyebilir
+0

Ne kadar basit bir iş çıkarmışsınız – Sauron

+0

Bilmediğinizde ne kadar basit. Sağol Sean. Vermeye devam eden hediye. :) – BobRodes

11

: Burada ben

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

Bildirimi bir şey (bir çift bağlamada hediyeler ile birlikte) bugüne kadar ne var

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

ben yıllardır ya da DataSource +1 –

2

Hemen aslında bunun üzerinde çalışıyor olduğunu yapabileceği Eğer

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

İlk geçerli:

DropDownList1.Items.Clear();

Sonra listItems öğesini dropDownList öğesine ekleyin.

Bu, dropDownList öğesinin, her geri gönderme veya eşzamansız bir geri gönderme işleminde her seferinde oluşturulmuş öğeleri sürekli olarak almasını engeller.

+0

ayarladıktan sonra her zaman için bunu yapmaktan çok hoşuma gitti. Bu gerçekten soruyu yanıtlamıyor, ama +1, çünkü sadece ASP ile başladığımda .NET, bunu çok iyi bilmem gerekiyordu, hehe :) Bunu anlamak için bana birkaç saat sürdü. – SirDemon