Подтвердить что ты не робот

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

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

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

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

(Этот DropDownList находится в веб-приложении ASP.NET 2.0, а кодовая часть находится в С#)

4b9b3361

Ответ 1

Вместо использования 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 -", ""));
}

Ответ 2

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

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

Ответ 3

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

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

В основном ответы на большинство вариантов:

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

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

  • Бланк ListItem определяется в html
  • AppendDataBoundItems="true"
  • DataBind НЕ вызывается при обратном вызове или когда элемент DropDownList count > 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();
    }
}

Примечание. Мне нравится логика проверки count и check IsPostBack. Хотя PostBacks часто являются причиной дублирования привязки данных, можно вызвать другие способы. Проверка количества элементов в основном проверяет, не загружена ли она.

ИЛИ (вместо этого можно использовать 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 -", ""));
}

Ответ 4

Вот идея, мы можем использовать 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();
}

Ответ 5

<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
  DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
    <asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
  ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
  SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>

Ответ 6

Код работает, попробуйте присвоить ему значение:

MyList.Items.Insert(0, new ListItem("- Select -", "0"));

Ответ 7

Вот идея.

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

С уважением.

Ответ 8

Просто добавьте EnableViewState = "false" в тег Dropdown

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true">
    <asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>