DropDownList AppendDataBoundItems (первый элемент должен быть пустым и без дубликатов)

У меня есть DropDownList внутри UpdatePanel, который заполняется при обратной передаче из SqlDataSource. У него есть параметр, который является другим элементом управления. Иногда мне нужно несколько обратных передач, но случается так, что каждый раз при обновлении панели обновлений элементы добавляются в DropDownList. Таким образом, DropDownList в конечном итоге имеет неверные или повторяющиеся данные.

У меня для свойства AppendDataBoundItems установлено значение true, потому что мне нужно, чтобы первый элемент был пустым.

Как я могу решить эту проблему? Есть ли другой способ получить пустой первый элемент?

(Этот DropDownList находится в веб-приложении ASP.NET 2.0, а программный код - на C #)


person zohair    schedule 08.04.2009    source источник


Ответы (5)


Вместо использования AppendDataboundItems='true' (что вызовет проблему, о которой вы говорите), ответьте на событие DataBound для DropDownList, а затем добавьте свой «пустой» элемент в начало списка.

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

Затем в вашем коде:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
person Keltex    schedule 08.04.2009
comment
Я единственный человек, у которого проблема с OnDataBound при поиске метода, который вы объявили для использования? Похоже, что он не смотрит в заднюю часть кода (несмотря на то, что весь DropDownList заполняется и создается там.) - person Hello World; 26.02.2013
comment
@Keltex: Интересно, почему, но у меня это тоже не сработало. При отладке он вообще не попадает в событие. - person Kardo; 12.10.2014
comment
извините, но в каждом сообщении в моем раскрывающемся списке не отображается строка выбора, и при отладке он не входит в событие привязки данных. как я могу это решить? - person Golnaz Saraji; 28.01.2015

Здесь есть хорошие ответы, но я почувствовал необходимость включить больше информации, потому что есть несколько вариантов, которые работают, и нам нужно решить, какой из них использовать.

Во-первых, мы должны понять AppendDataBoundItems. Если AppendDataBoundItems = "true", ListItems добавляются к DropDownList без удаления старых. В противном случае DropDownList очищается перед следующим DataBind. MSDN AppendDataBoundItems документ

В основном есть 2 варианта ответов:

1. Определите пустой вариант в html и добавьте ListItems из базы данных в DropDownList только один раз.

Обратите внимание на 3 вещи:

  • Пустой ListItem определен в html
  • AppendDataBoundItems="true"
  • DataBind НЕ вызывается при обратной передаче или когда количество элементов DropDownList> 1

Источник:

<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
    <asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>

Код позади:

protected void Page_Load(object sender, System.EventArgs e)
{
    if (MyList.Items.Count <= 1 ) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}

Примечание: мне нравится логика проверки счетчика и проверки IsPostBack. Хотя PostBack часто является причиной дублирования привязки данных, это можно вызвать другими способами. Проверка количества элементов - это просто проверка, загружен ли он уже.

ИЛИ (вместо этого можно использовать IsPostBack)

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}

2. Очищайте и повторно загружайте DropDownList при каждом обновлении страницы.

Обратите внимание на 3 отличия от первого варианта:

  • AppendDataBoundItems="false" (если не определено, то false - значение по умолчанию)
  • В программный код добавлен пустой ListItem. Мы не можем определить его в html, потому что с AppendDataBoundItems="false" он будет очищен.
  • DataBind вызывается каждый Page_Load

Источник:

<asp:DropDownList ID="MyList" runat="server" DataValueField="Id"  DataTextField="Name" 
    OnDataBound="MyList_DataBound" >
</asp:DropDownList>

Код позади:

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 -", ""));
}
person Tony L.    schedule 21.07.2015

Вероятно, вы привязываете этот DropDownList в коде. Так что не стоит делать это снова после обратной передачи:

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};
person gius    schedule 21.12.2009

Вот идея, мы можем использовать 2 события: DataBound и 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();
}
person Terminator    schedule 27.12.2010
comment
Очистка списка в функции MyListDataBinding фактически то же самое, что установка AppendDataBoundItems = false. - person Tony L.; 22.07.2015

Вот идея.

В раскрывающемся списке есть свойство AutoPostBack, установите для него значение true, а затем в коде вы поместите весь метод привязки внутри if(!Page.IsPostBack). У меня это сработало.

С уважением.

person Miguel    schedule 22.07.2010