DropDownList OnSelectedIndexChange à 0e index w/out ViewState
J'ai fait suivre l'article VRAIMENT Comprendre l'état d'affichage (excellent article d'ailleurs) et le remplissage de ma liste déroulante est génial de travailler. J'ai même l'installation d'un OnSelectedIndexChange événement qui se déclenche presque aussi grand.
Le problème que j'ai trouvé est l'événement SelectedIndexChanged ne se déclenche pas lors de la sélection de la 0e index. Il n'toutes les autres fois cependant.
Voici un code:
<asp:DropDownList runat="server" ID="DropDownList1" EnableViewState="false"
AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
protected override void OnInit(EventArgs e)
{
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataSource = fillQueueDropDown();
this.DropDownList1.DataBind();
base.OnInit(e);
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
OnSelectedQueueChanged(e);
}
public void OnSelectedQueueChanged(EventArgs e)
{
//Do stuff.
}
public event EventHandler queueNamesChangedEvent;
public void OnSelectedQueueChanged(EventArgs e)
{
if (queueNamesChangedEvent != null)
queueNamesChangedEvent(this, e);
}
Je suppose que je peux faire un peu de type de l'enregistrement dans la méthode Page_Load:
if(ViewState["selectedIndexChangedFlag"] != 1)
//raise OnSelectedChange event
Ou est-il quelque chose que je peux l'installation dans la méthode OnInit() où je suis reliaison ces données à chaque fois que je peux faire?
Voir, ma coutume EventHander déclenche un événement qui est pris par une de la page parent dans lequel ce contrôle réside, afin que le parent puisse prendre des mesures à l'aide de la nouvelle valeur sélectionnée. Et c'est actuellement en train de travailler pour tous les cas où l'index sélectionné > 0.
J'ai créer une propriété dans ce contrôle qui contient le plus récemment index sélectionné, auquel cas ma page parent peut d'action sur la valeur de cette propriété sur tous les Page_Load... je ne sais pas.
Ouvert aux suggestions. Ou comment la force de cet événement SelectedIndexChanged à feu pour que 0e la sélection d'index.
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous chargez les données à chaque fois et c'est la réinitialisation de l'index sélectionné. Imaginez que c'est votre déroulante:
Puis dans le client de modifier l'index sélectionné:
Cela remplit le caché entrée
__EVENTARGUMENT
avec votre nouvel indice (1) et le caché entrée__EVENTTARGET
avec leid
de votre liste déroulante. Maintenant, du côté serveur, le code de coups de pied dans la recharge de vos données:"zéro" est la valeur sélectionnée parce que c'est la valeur par défaut lors du chargement des données. Alors ASP.NET recherche
__EVENTTARGET
et__EVENTARGUMENT
dans leRequest
et trouve votre déroulant duid
et trouve le nouvel indice (1). Maintenant, votre déroulant ressemble à ceci:Depuis que l'indice a changé, la liste déroulante soulève sa
SelectedIndexChanged
événement indiquant que l'indice a changé. Évidemment, c'est la partie qui est au travail, voyons maintenant pourquoi choisir le premier élément de la liste ne déclenche pas l'événement.Maintenant permet de dire que nous avons encore de la liste déroulante dans l'état où il était juste dans (avec "on" est sélectionnée et l'index sélectionné de 1). Ce qui se passe lorsque l'on sélectionne le premier élément de la liste sur le client?
__EVENTTARGET
et__EVENTARGUMENT
sont remplis avec lesid
de la liste déroulante et le nouvel indice (0). Puis, le serveur charge les données dans la liste déroulante et le menu qui ressemble maintenant à ceci encore:Remarquer que depuis que vous avez rechargé les données avant les événements déclenchés l'index est déjà réglé à 0 parce que c'est la valeur par défaut. Maintenant, quand votre événement se déclenche et la liste déroulante de l'index sélectionné est réglé sur 0, la liste déroulante ne voit pas cela comme un changement depuis l'index sélectionné (aussi loin qu'il le sait) n'a pas changé.
Ici est de savoir comment résoudre le problème:
Ce que cela va faire est de ne charger les données dans la liste déroulante si la page n'est pas une publication. Cela signifie que ViewState permettra de conserver les données pour vous ainsi que l'index sélectionné de sorte que lorsque vous publier la liste déroulante sera de comparer le nouvel indice pour l'indice que vous avez vu dans le client.
Mon but avec la désactivation de l'état d'affichage sur cette liste déroulante pour réduire la taille de l'état d'affichage de la page.
Le problème que j'ai eu à le faire seulement le if(!Page.IsPostBack){...DataBind()...}, c'est que lorsque vous sélectionnez un élément pour la première fois, et le rechargement de la page, ma liste déroulante est vide.
Ce que j'ai fait était de créer une autre Propriété sur ce contrôle, LastIndex. Lorsque le OnSelectedIndexChanged événement se déclenche, je l'ai mise à jour de la LastIndex valeur. Dans le Page_Load, je compare le Courant et les Dernières valeurs de l'indice, si ils sont différents, puis le feu d'un Indice événement a changé.
Vous avez raison cependant. Les données sont chargées à nouveau et re-lié dans le OnInit phase. Alors que le ViewState est restaurée (et quand les 0e indice est rétabli), lorsque nous arrivons finalement à des Événements phase, le contrôle ne détecte pas le changement.
Pas sûr que c'est le plus élégant de la route, mais ça fonctionne bien jusqu'à présent.
Puis j'ai trouvé ça dans la msdn docs pour IPostBackDataHandler:
Depuis la valeur actuelle est la même que la changé de valeur, l'événement n'est pas déclenché.