Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add empty item to dropdownlist of custom objects in C#

Tags:

c#

asp.net

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?

like image 357
Jeffrey Cameron Avatar asked Mar 24 '09 20:03

Jeffrey Cameron


3 Answers

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.

like image 138
Sean Bright Avatar answered Oct 21 '22 05:10

Sean Bright


You could add to the databound event:

protected void DropDownList1_DataBound(object sender, EventArgs e)
        {
            DropDownList1.Items.Insert(0,new ListItem("",""));
        }
like image 22
Richard Avatar answered Oct 21 '22 04:10

Richard


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);
like image 39
George Mauer Avatar answered Oct 21 '22 05:10

George Mauer