Странное поведение привязки данных DropDownList в ASP.NET WebForms?

Резюме

Я загружаю города из контекста данных в два разных списка и привязываю их к соответствующим элементам управления DropDownList.

Хотя код одинаков для обоих, и отличаются только данные и, очевидно, названия элементов управления, привязка данных, похоже, не работает должным образом только для одного из них. Вместо названия города отображается его идентификатор, то есть только для первого варианта!

Код программной части

У нас есть два элемента управления DropDownList:

  1. DestinationDropDownList ;
  2. OriginDropDownList .

Затем я заполняю их.

public partial class MyControl : UserControl {
    protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {
            var instruction = new City() {
                CityId = Guid.Empty,
                CityName = "- Select a city -"
            };

            var destinations = context.Cities.ToList();
            destinations = destinations.OrderBy(c => c.CityName).ToList();
            destinations.Insert(0, instruction);
            DestinationDropDownList.DataSource = destinations;
            DestinationDropDownList.DataTextField = "CityName";
            DestinationDropDownList.DataValueField = "CityId";
            DestinationDropDownList.DataBind();

            var origins = context.Cities.ToList();
            origins = origins.OrderBy(c => c.CityName).ToList();
            origins.Insert(0, instruction);
            OriginDropDownList.DataSource = origins;
            OriginDropDownList.DataTextField = "CityName";
            OriginDropDownList.DataValueField = "CityId";
            OriginDropDownList.DataBind();
        }
    }
    private static readonly MyDataContext context = new MyDataContext();
}

HTML

<asp:DropDownList ID="DestinationDropDownList" runat="server" />
<asp:DropDownList ID="OriginDropDownList" runat="server" />

Отображение базы данных

*DestinationDropwDownList*
    - 0000-0000-0000-0000-0000 (empty Guid)
    - CityName 01
    - CityName 02
    - ...

*OriginDropDownList*
    - - Select a city -
    - CityName 01
    - CityName 02
    - ...

Правильным отображением является отображение, отображаемое с помощью элемента управления OriginDropDownList . Почему DestinationDropDownList не отображает данные правильно, то есть для первого и только первого элемента в своем списке !? Я вообще не понимаю и потерял несколько часов, пытаясь найти решение! = (

  1. Я попытался удалить первый элемент перед вставкой инструкции;
  2. Я попытался вставить инструкцию дважды, затем удалить первую;
  3. Я попытался использовать DropDownList.Items. Add (string) , и он ничего не отображал, как для первой строки, вместо пустого Guid.

Вопросы

  1. Сталкивались ли вы когда-нибудь с такими проблемами с элементом управления DropDownList?
  2. Как исправить такое поведение!?

РЕДАКТИРОВАТЬ №1

Ответ michielvoo помог мне найти новый способ привязки данных к инструкции. Через его код найденный обходной путь таков:

<asp:DropDownList ID="DestinationDropDownList" runat="server"
                  AppendDataBoundItems="true"
                  CssClass="required">
    <asp:ListItem Value="- Select a city -" />
</asp:DropDownList>

удаление вставки инструкции из кода только для этого самого DropDownList. Теперь он отображает именно то, что я хотел с самого начала.

Я принял его ответ, поскольку именно он привел меня к хорошему обходному пути. Я не думаю, что это реальное решение, но пока результаты их, я не возражаю. Кроме того, вместо того, чтобы проверять наличие Guid.Empty для проверки страницы, мне придется проверить мои инструкции и сделать страницу недействительной, если пользователь не выбрал город, расположенный в другом индексе, кроме 0, так как моя проверка с помощью Guid не удалась.

РЕДАКТИРОВАТЬ №2

С кодом программной части, указанным в ответе michielvoo, он полностью решил проблему, с которой я столкнулся с DropDownList , отображающим свойство ListItem.Value вместо свойства ListITem.Text только для и только первого элемента в списке. Я не знаю, что не так с другими способами, но этот отлично работает!

Спасибо, michielvoo!

Спасибо всем за вашу поддержку! =)

5
задан Community 23 May 2017 в 11:45
поделиться