Jeffrey Cameron
Jeffrey Cameron

Reputation: 10285

Add empty item to dropdownlist of custom objects in C#

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

Answers (4)

soaringCelia
soaringCelia

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

George Mauer
George Mauer

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

Richard
Richard

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

Sean Bright
Sean Bright

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

Related Questions