DropDownList AppendDataBoundItems (first item to be blank and no duplicates)
Solution 1
Instead of using AppendDataboundItems='true'
(which will cause the problem you are talking about), respond to the DataBound
event for the DropDownList
and then add your "blank" item to the top of the list.
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
Then in your code behind:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
Solution 2
There are good answers here but I felt the need to include more information because there are multiple options that work and we need to decide which to use.
First, we should understand AppendDataBoundItems
. If AppendDataBoundItems = "true"
, ListItems
are added to the DropDownList
without clearing out the old ones. Otherwise, the DropDownList
is cleared about before the next DataBind
. MSDN AppendDataBoundItems doc
There are basically 2 options covered by most of the answers:
1. Define a blank option in html and add the ListItems from the database to the DropDownList only once.
Notice 3 things here:
- Blank
ListItem
is defined in html AppendDataBoundItems="true"
-
DataBind
is NOT called on postbacks or when theDropDownList
item count is > 1
Source:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
Code behind:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
Note: I like the logic of checking the count vs checking IsPostBack
. Though PostBacks are often the cause of duplicate databinding, it is possible to cause it other ways. Checking the item count is basically just checking to see if it's already been loaded.
OR (option to use IsPostBack
instead)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Clear and reload the DropDownList on each page refresh.
Notice 3 differences from the first option:
-
AppendDataBoundItems="false"
(if it is not defined thenfalse
is it's default value) - Blank
ListItem
is is added in code behind. We can't define it in html because withAppendDataBoundItems="false"
, it would be cleared out. -
DataBind
is called on everyPage_Load
Source:
<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
Code behind:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}
Solution 3
You probably bind that DropDownList in the code behind. So you should not do it after postback again:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Solution 4
Here is an idea, we can use 2 events: DataBound and DataBinding:
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
zohair
Updated on May 21, 2020Comments
-
zohair about 4 years
I have a
DropDownList
inside anUpdatePanel
that is populated on postback from aSqlDataSource
. It has a parameter which is another control. I sometimes need multiple postbacks, but what happens is that each time the update panel refreshes, items are added to theDropDownList
. So theDropDownList
ends up having data that is incorrect, or repeated data.I have the
AppendDataBoundItems
property set totrue
because I need the first item to be blank.How can I overcome this problem? Is there another way to have a blank first item?
(This
DropDownList
is in an ASP.NET 2.0 web app, and codebehind is in C#) -
Hello World about 11 yearsAm I the only person is having an issue with OnDataBound finding the method you have declared it to use? It doesn't appear to be looking in the back end of the code (Despite the fact the whole DropDownList is populated and created there.)
-
Kardo over 9 years@Keltex: I wonder why, but it didn't work for me too. In debug, it doesn't hit the event at all.
-
Golnaz Saraji over 9 yearssorry but in each post back my dropdownlist does not show the "select" string and in debug it does not enter to databound event. how can I solve that?
-
Tony L. almost 9 yearsClearing the list in MyListDataBinding function is effectively the same thing as setting AppendDataBoundItems="false".