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:
DestinationDropDownList
;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! =(
- J'ai essayé de supprimer le premier élément avant de l'insérer l'instruction;
- J'ai essayé d'insérer l'instruction à deux reprises, puis supprimer le premier;
- 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
- A jamais rencontré de tels problèmes avec le contrôle DropDownList?
- 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! =)
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
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas rencontré ce problème avant, mais je vais essayer de répondre à votre deuxième question. Je vois que peu de valeur dans l'ajout de la première de "pédagogique" de l'élément à l'aide de code (corrigez-moi si je me trompe). Je préfère l'ajouter directement à la marque:
Le premier élément de survivre à la liaison de données en raison de l'utilisation de la
AppendDataBoundItems
attribut. J'ai aussi ajouté leDataTextField
etDataValueField
attributs, vous pouvez supprimer ceux du code.Une autre chose que vous pouvez faire avant de liaison de données, consiste à projeter les entités
ListItem
instances:De cette façon, vous n'avez pas à définir la
DataTextField
ouDataValueField
des propriétés sur le contrôle que vous êtes déjà la création de la liste des éléments de vous-même.+1 pour m'enseigner d'une manière dont je ne connaissais pas. - Ajout de la première
ListItem
comme vous le faites de bonnes œuvres, que je puisse voir l'article, même après la liaison de données se produit. Toutefois, uniquement pour le premier élément, c'est sa valeur qui est affichée, donc je vais continuer à voir laGuid.Empty
valeur. On dirait qu'il fait cela seulement avec le premier élément de la liste, que je puisse voir mes instructions de celui que j'ai inséré dans le code.Quant à mon point de le faire à travers le code, c'est juste parce que c'est la façon de le faire dans les Windows Forms. Je suis assez débutant dans le développement Web, donc je ne suis pas encore vraiment connaissance avec ces HTML et ASP.NET les balises et les attributs. Je préfère voir le code C#, j'ai l'impression que ça me permet de mieux contrôler les commandes et ce qui se passe dans la page, dans l'ensemble. =)
Dites-vous que, même avec la
Text
ensemble d'attributs dans le marquage pour le premier élément, c'est encore l'affichage de 0000-0000...? J'ai modifié le code un peu plus, à voir si cela aide.J'ai utilisé votre chemin de liaison de données pour le premier point, le réglage de la
ListItem.Value
propriété"- Select a city -"
. J'ai enlevé l'instruction insérer dans le code, et le résultat est exactement ce que je voulais faire. Je n'ai juste pas encore comment cela peut arriver, malheureusement. Nous avons trouvé un moyen de contourner le problème, mais ce n'est pas la vraie solution, comme votre code exact devrait faire l'affaire. De toute façon! Merci pour votre aide!OriginalL'auteur Michiel van Oosterhout