selectedIndex est perdu pendant les publications - ASP.NET
J'ai un contrôle de zone de liste:
<asp:ListBox runat="server" id="lbox" autoPostBack="true" />
Le code derrière ressemble à:
private void Page_Load(object sender, System.EventArgs e)
{
lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged);
if(!Page.IsPostBack)
{
LoadData();
}
}
private LoadData()
{
lbox.DataSource = foo();
lbox.DataBind();
}
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e)
{
int index = (sender as ListBox).selectedIndex;
}
Mon problème est que lorsque ma page reçoit un message de retour (lorsqu'un utilisateur effectue une sélection dans la zone de liste), la sélection toujours "saute" sur le premier élément dans la zone de liste, de sorte que la variable d'index dans ma fonction de rappel est toujours 0.
Semble que cela peut être un viewstate problème? Comment puis-je résoudre ce problème de sorte que la sélection de l'indice reste au travers de la publication?
Il n'y a pas d'ajax se passe, c'est .NET 1.0.
Grâce.
EDIT 1 JohnIdol a réussi à me faire un pas de plus, Si je change la source de données à partir de l'original de mes DataTable à une liste de tableaux, alors que tout fonctionne correctement...ce qui serait à l'origine?
Edit 2 Il s'avère que ma DataTable avait plusieurs valeurs qui étaient les mêmes, de sorte que les indices ont été traités comme le même que tous les éléments ayant la même valeur...merci à ceux qui m'ont aidé!
- exactement les mêmes trucs .NET 2.0 fonctionne très bien pour moi
- heureux de voir que votre problème est résolu
Vous devez vous connecter pour publier un commentaire.
Quel est le résultat de la foo() appel de fonction?
Remplissage manuellement la zone de liste, vous pouvez définir des indices de ce que vous voulez (0 par exemple) - de sorte que la même chose peut se produire réglage d'une source de données dans certaines circonstances (qui spécifie l'index, je suppose). Si tous les élément d'index 0, le résultat est que l'événement SelectedIndexChanged n'est pas déclenché (indice ne change pas!) et tout ce qui est foiré: sur post-retour de sélection pour revenir à la premier élément de la liste.
Cela expliquerait-il - je ne peux pas penser à autre chose - il fonctionne très bien pour moi .NET 2.0, je suis en utilisant une liste de tableaux de chaînes pour remplir la zone de liste.
Je n'arrive pas à reproduire votre problème est le réglage de tous les indices de 0.
Je dirais ajouter une montre à la zone de liste et de vérifier les index au moment de l'exécution pour s'assurer qu'ils ne sont pas tous des zéros.
La réel question ici est de l'ordre des événements. Lorsque vous databind dans page_load d'écraser les données publiées, c'est pourquoi la sélection n'est pas définie dans la zone de liste. Vous pouvez facilement résoudre ce problème en déplaçant la logique de liaison à Page_Init.
si votre listbox éléments sont les mêmes, puis choisi indice de get set à 0.Pour y remédier, définir des valeurs différentes pour
item.value
et laissezitem.text
reste le même..puis index sélectionné seront affichées correctement.Databinding DropDownLists/ListBoxes est douloureux, parce que souvent ils se lient à des valeurs erronées.
Je vous ai donné sur l'utilisation de DataBind(), et juste en station à l'aide d'une boucle Foreach:
Charger les données dans le Page_Init au lieu de le Page_Load. Les données doivent être remplies au cours de l'Page_init être disponibles dans la Publication.
Il me semble que vous êtes la création d'un nouveau gestionnaire d'événements sur chaque chargement de la page. Ce pourrait être la cause du problème. Pourquoi ne pas joindre le gestionnaire d'événements de manière déclarative:
aussi, pourquoi ne pas référencer le contrôle directement, au lieu de casting?
Fonctionne pour moi aussi. Est-ce que votre foo() renvoient les mêmes valeurs à chaque fois?
Tout comme une note de côté: si possible, vous devriez vraiment faire de votre liaison de données dans OnInit (à chaque fois, et pas seulement sur l'Obtient). Si vous le faites avant l'appel à la base.OnInit(...), le contenu de votre zone de liste n'aurez pas à sérialiser et désérialiser et de l'état d'affichage et de les envoyer sur le fil pour le client (oui, vous serez frappé de la base de données de plus de, mais vous serez frapper un système qui est situé sur votre réseau local, ou même sur la même machine. En outre, la base de données susceptibles de mettre en cache le résultat).
Si vous voulez construire la haute performance des sites web, vous avez besoin de prendre un coup d'oeil près à la façon dont vous utilisez ViewState. Je recommande fortement cet article: VÉRITABLE Compréhension de l'état d'affichage
Avez-vous pensé à charger les données antérieures (par exemple, dans OnInit de l'événement sur la page/de contrôle de l'utilisateur. Cela se produit avant la publication de données est chargé, et donc avant un changement peut être traitée? Je crois que le travail - mais vous souhaitez peut-être désactiver viewstate!
Je ne sais pas si cela fait une différence ou pas, mais en général, je fixe mes contrôles à des événements sur la page d'accueil plutôt que dans le code-behind. Dans votre exemple, je l'aurais fait:
Autre que cela, je voudrais vérifier que l'état d'affichage est activé. État d'affichage peut être désactivé au contrôle, à la page, & même au niveau du site.