We are binding a list of custom objects to an ASP.NET DropDownList in C# but we want to allow for the DropDownList to not have anything selected initially. One way of doing
You could add to the databound event:
protected void DropDownList1_DataBound(object sender, EventArgs e)
{
DropDownList1.Items.Insert(0,new ListItem("",""));
}
First:
DropDownList1.Items.Clear();
Then add listItems to the dropDownList.
This prevents the dropDownList from acquiring an ever increasing list of items every time it is rendered in a postback or asynchronous postback.
Yes, create your list like so:
<asp:DropDownList ID="Whatever" runat="server" AppendDataBoundItems="True">
<asp:ListItem Value="" Text="Select one..." />
</asp:DropDownList>
(Note the use of AppendDataBoundItems="True"
)
And then when you bind, the bound items are put after the empty item rather than replacing it.
Just working on this actually, here's what I got so far (along with a couple databinding goodies)
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>(); }
}
}
Notice one thing that you can do is
dropDown.BindToProperties(myCustomers, c=>c.CustomerName, c=>c.Id);