ASP.NET WebForms DropDownList liaison de données étrange comportement?

Résumé

- Je charger des villes dans le contexte de données en deux listes différentes et de les lier à leurs contrôles DropDownList.

Bien que le code est le même pour les deux, et seulement les données et bien évidemment, le nom de l'contrôles sont différents, la liaison de données semble ne pas fonctionner correctement pour un seul d'entre eux. Au lieu d'afficher le nom de la ville, il affiche son identité, c'est, pour la première option!

Code-behind

Nous avons deux contrôles DropDownList:

  1. DestinationDropDownList;
  2. OriginDropDownList.

Ensuite, je les remplir.

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" />

Donnée affichée

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

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

L'affichage correct est celui rendu par OriginDropDownList de contrôle. Pourquoi est - DestinationDropDownList pas afficher correctement les données, qui est, pour le premier et seul le premier élément de sa liste!? Je ne comprends pas du tout et a perdu quelques heures déjà essayer de trouver la solution! =(

  1. J'ai essayé de supprimer le premier élément avant de l'insérer l'instruction;
  2. J'ai essayé d'insérer l'instruction à deux reprises, puis supprimer le premier;
  3. J'ai essayé d'aller avec la DropDownList.Items.Add(string) méthode, et ce fut l'affichage rien que pour la première ligne, au lieu du vide Guid.

Questions

  1. A jamais rencontré de tels problèmes avec le contrôle DropDownList?
  2. Comment corriger ce comportement!?

EDIT #1

michielvoo's réponse m'a aidé à trouver un nouveau moyen de données de liaison de l'enseignement. Par le biais de son code, à la trouvé de solution de contournement est: est-ce

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

de retirer le feuillet d'instruction de l'intérieur le code pour cette très DropDownList. Maintenant, il affiche exactement ce que je voulais depuis le début.

J'ai accepté sa réponse car c'est lui qui m'a conduit à une belle solution de contournement. Je n'ai pas l'impression que c'est la vraie solution, mais tant que les résultats, c'est la leur, je n'ai pas l'esprit de beaucoup. De côté, au lieu de vérifier pour un Guid.Empty pour la validation de la page, je vais vérifier, pour mon instruction, et d'annuler la page lorsque l'utilisateur n'a pas de sélectionner une ville située à un autre indice de 0, depuis mon bilan avec un Guid échouera.

EDIT #2

Avec le code-behind a déclaré dans michielvoo réponse, il a totalement résolu le problème que j'ai eu pour la DropDownList de l'affichage de la ListItem.Value de la propriété au lieu de la ListITem.Text propriété pour, et uniquement le premier élément de la liste. Je ne sais pas quel est le problème avec les autres moyens, mais celui-ci fonctionne très bien!

Grâce michielvoo!

Merci à vous tous pour votre soutien! =)

Je ne suis pas en mesure de reproduire ce problème...
JonH: je suis un peu content que vous ne pouvez pas, parce que c'est une douleur quand il se passe! 😉 Merci pour votre grain de sel! =)
Je juste ne peux pas comprendre pourquoi ce qui se passe pour vous...
Placer un point d'arrêt sur DestinationDropDownList.DataBind() et le débogage de votre application. Après l'exécution de cette ligne, qu'est-ce que la valeur de DestinationDropDownList.Items[0].Text?
JonH: Moi non plus! =P

OriginalL'auteur Will Marcouiller | 2012-01-25