Reputation: 10285
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 this might be to create an intermediate list of strings, populate the first one with an empty string and then populate the rest of the list with the custom object information.
This doesn't seem very elegant however, does anyone have a better suggestion?
Upvotes: 6
Views: 11849
Reputation: 11
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.
Upvotes: 1
Reputation: 122052
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);
Upvotes: 2
Reputation: 22016
You could add to the databound event:
protected void DropDownList1_DataBound(object sender, EventArgs e)
{
DropDownList1.Items.Insert(0,new ListItem("",""));
}
Upvotes: 11
Reputation: 120634
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.
Upvotes: 23