2009-10-21 7 views
1

J'ai une liste déroulante contenant quelques choix. Basé sur la sélection de l'utilisateur, j'ai besoin de créer des contrôles dynamiques et les rendre sur le formulaire. Je comprends que les contrôles dynamiques doivent être créés dans OnInit ou dans CreateChildControls afin que ViewState pour ces contrôles dynamiques soit restauré correctement par le moteur d'exécution. Le problème est que je ne parviens pas à obtenir la valeur SelectedValue de la liste déroulante dans OnInit ou CreateChildControls puisque ViewState n'a pas encore été restauré pour la liste déroulante.Création de contrôles dynamiques basés sur la valeur sélectionnée d'un contrôle statique

Est-il possible d'obtenir la sélection en cours afin que je puisse créer les contrôles dynamiques en fonction de la sélection d'utilisateur et ajoutez la page correctement

EDIT: Le balisage se présente comme suit:

<form id="form1" runat="server"> 
<div> 
    <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" AppendDataBoundItems="true"> 
     <asp:ListItem Text="(Select Color)" Value="" /> 
     <asp:ListItem Text="Red" Value="Red" /> 
     <asp:ListItem Text="Green" Value="Green" /> 
     <asp:ListItem Text="Blue" Value="Blue" /> 
    </asp:DropDownList> 
    <asp:PlaceHolder ID="plHolder" runat="server" /> 
</div> 
</form> 

et voici le code derrière:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     TextBox tb = new TextBox(); 
     if (ddl.Text != "") 
     { 
      tb.Text = ddl.Text; 
      if (Session["id"] != null) 
      { 
       string id = Session["id"].ToString(); 
       tb.ID = id; 
      } 
      else 
      { 
       Session["id"] = tb.ID = Guid.NewGuid().ToString().Replace("-", ""); 
      } 
      plHolder.Controls.Add(tb); 
     } 

    } 
} 

Sur la ligne "tb.Text = ddl.Text;" J'espère obtenir la sélection en cours et en fonction de cela définir la valeur de la propriété de texte pour le contrôle dynamique. Mais la sélection actuelle n'a pas encore été définie depuis OnInit.

+0

vous devez poster un code pour vérifier où est le problème, Selon votre déclaration, il semble OK. –

+0

J'ai ajouté du code pour capturer l'essence de ce que j'essaie de faire –

Répondre

2

Si les contrôles doivent vraiment être créés dans OnInit ou CreateChildControls, une chose que vous pouvez faire est obtenir la valeur de votre contrôle statique de la collection Request.Form [] pendant OnInit.

Ainsi, au lieu de faire:

string selected = myDropDown.SelectedValue; 

vous

string selected = Request.Form[myDropDownUniqueID]; 

... où myDropDownID est le 'identifiant unique' attribué à myDropDown. Notez que cela sera généralement le même que le 'id' assigné au contrôle, sauf s'il se trouve dans un conteneur de contrôle.

Cela extrait effectivement la valeur directement des données de formulaire HTML envoyées au serveur, plutôt que d'attendre que ASP.NET la décompacte dans les propriétés du contrôle.

+0

@codeulike: Request.Form [myDropDownUniqueID] semble fonctionner correctement lorsque l'ID déroulant est défini de manière autonome et non dans un conteneur. Des suggestions sur la façon d'obtenir l'ID unique lorsque le menu déroulant fait partie d'un EditItemTemplate dans un Gridview? Je dois accéder à l'ID unique de la liste déroulante pour la ligne en cours de modification. –

+0

Je suppose que pendant OnInit le contrôle GridView ne sera pas prêt à vous dire ce qu'il contient.Votre meilleur pari peut être de faire une boucle sur le contrôle GridView sur la publication précédente (par exemple, peu de temps après sa databound), extraire les UniqieID de chaque contrôle et les stocker dans Session [] pour une utilisation ultérieure. – codeulike

+0

Ou ... les ID uniques attribués aux contrôles dans GridViews sont assez prévisibles (regardez la source de la page rendue). Vous pourriez être en mesure d'exploiter cela. En outre, vous pourriez être en mesure de parcourir la collection Forms [] à la recherche de clés correspondant au motif. – codeulike

Questions connexes