Restaurer un menu déroulant de l'élément sélectionné après la publication
L'IDÉE
Je suis en train de faire une chose très simple rafraîchissement de la page lorsqu'un élément de la liste est sélectionné. L'élément sélectionné de la liste déroulante est transmis à la chaîne de requête comme un paramètre. La Page est rechargée. Ensuite, les paramètres sont pris à partir de la chaîne de requête et utilisé pour restaurer la sélection de la liste déroulante. Paramètre conserve la valeur de l'élément sélectionné.
LE PROBLÈME
Réelle valeur sélectionnée n'est pas transmise au paramètre de chaîne de requête, il est toujours à "0". DropDownList n'est jamais le dernier élément sélectionné, il restaure toujours celle qui est enregistrée dans l'état d'affichage. ViewState ne veux pas me souvenir de trucs nouveaux, il garde toujours un seul et même info. J'ai essayé de trouver la solution depuis des mois. Sur certaines pages, il fonctionne, mais dans la plupart des cas, il n'est pas. Si elle a travaillé quelque part dans mon application web, je n'avais aucune idée de pourquoi, et espérait qu'elle continuerait à travailler le lendemain. Parfois, il a juste arrêté de travailler et je n'étais pas en mesure de le réparer.
PAR DÉFAUT DE LA PAGE ASPX
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ExperimentalPage.aspx.cs"
Inherits="ExperimentalPage" Title="Enperimental Page" EnableViewState="True" %>
<asp:Content ID="ExperimentalLeftPane" ContentPlaceHolderID="cph_LeftPane" Runat="Server">
<div style="position: absolute; left: 0px; top: 35px; width: 250px;">
<asp:DropDownList ID="dd1" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="class_DropDown" Style="width: 250px; margin-bottom: 3px;"/>
</div>
</asp:Content>
ASPX PAR DÉFAUT.CS PAGE CODE-BEHIND
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
dd1.Items.Insert(0, "dd1-0");
dd1.Items[0].Value = "0";
dd1.Items.Insert(1, "dd1-1");
dd1.Items[1].Value = "1";
dd1.Items.Insert(2, "dd1-2");
dd1.Items[2].Value = "2";
}
else
{
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
}
}
protected void RefreshPage(object o, EventArgs e)
{
Page.Response.Redirect("ExperimentalPage.aspx?"
+ "&dd1=" + dd1.SelectedValue);
}
LES TENTATIVES POUR LE FAIRE FONCTIONNER
Scénario 1. EnableViewState="True"
Je sélectionne troisième élément (avec la valeur "2") de la dropdownlist, la page est rechargée. Chaîne de requête ne prend jamais la valeur "2". Il est toujours "0". Le premier élément est toujours sélectionné après la publication, peut-être à cause de l'état d'affichage, qui le remet à zéro.
Le scénario 2. EnableViewState="False"
Valeur sélectionnée n'est pas enregistrée. DropDownList est complètement vide après la publication.
Scénario 3. EnableViewState="False". Dropdownlist est rempli avec des données sur chaque chargement de la page. La publication n'est vérifiée que pour récupérer la valeur sélectionnée:
protected void Page_Load(object sender, EventArgs e)
{
//if (!Page.IsPostBack)
//{
dd1.Items.Insert(0, "dd1-0");
dd1.Items[0].Value = "0";
dd1.Items.Insert(1, "dd1-1");
dd1.Items[1].Value = "1";
dd1.Items.Insert(2, "dd1-2");
dd1.Items[2].Value = "2";
//}
//else
if (Page.IsPostBack)
{
dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"])));
}
}
Dans ce cas, la valeur sélectionnée est jamais enregistrée sur la chaîne de requête et de la liste déroulante de l'élément sélectionné n'est jamais restauré.
UNE GRANDE QUESTION
Ce qui me manque et comment le faire garder à la valeur sélectionnée et les restaurer après la publication?
LE PROBLÈME PARTIELLEMENT RÉSOLU
Voir ma réponse
Regarder le PAGE ASPX code. C'est une méthode pour la DropDownList.
OriginalL'auteur SWA | 2013-07-04
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai compris comment résoudre le problème. Si quelqu'un en a besoin, c'est la solution.
Dans cette solution EnableViewState page de propriété est Vrai.
Il n'y a pas de redirection de Page. Chaîne de requête n'est pas utilisé. Au lieu de cela, Session variable est utilisée. C'est une bonne façon de garder les valeurs en cours de publication.
OriginalL'auteur SWA
Lorsque vous sélectionnez un élément dans la liste déroulante, vous a frappé le
Page_Load()
avant laRefreshPage()
méthodeQui veut dire que vous exécutez cette ligne avant la RefreshPage méthode:
Convertir.ToString(Requête.QueryString["dd1"])) permettra d'évaluer la valeur null, ce SelectedIndex sera mis à 0.
Si vous voulez faire ce travail, vous devriez essayer les suivantes:
OriginalL'auteur michaeldk