Je n'arrive pas à obtenir les valeurs d'entrée des contrôles créés dynamiquement dans ListView.Récupère les valeurs des contrôles ajoutés dynamiquement dans ListView
Voici mon ListView:
<asp:ListView ID="lvQuestions" runat="server" DataKeyNames="ProductQuestionId" onitemdatabound="lvQuestions_ItemDataBound">
<LayoutTemplate>
<table>
<tr runat="server" id="itemPlaceholder"></tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Question") %></td>
<td>
<asp:PlaceHolder ID="plControl" runat="server" />
<asp:HiddenField ID="hfQuestionId" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" />
Dans mon ItemDataBound Handler j'ajoute une zone de texte ou un autre contrôle à la Placeholder. Le type de contrôle dépend de l'élément, mais pour le garder simple, supposons qu'il s'agit toujours d'une zone de texte. L'identifiant du contrôle est également dynamique.
// create a textbox control
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + productQuestionId.ToString(); //productQuestionId is the datakey value of this ListViewItem
placeholder.Controls.Add(txtbx);
Lorsqu'un utilisateur clique sur le bouton, je dois pouvoir obtenir les valeurs qu'ils ont remplies.
Dans ma recherche, j'ai trouvé que je dois d'abord recréer les contrôles ajoutés dynamiquement afin d'obtenir les valeurs de ceux-ci en raison du cycle de vie de la page.
Voici ce que j'ai dans mon gestionnaire de bouton pour recréer les contrôles:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = new TextBox();
txtbx.ID = "txtQuestion_" + hdField.Value;
plcHolder.Controls.Add(txtbx);
}
alors le bloc de code suivant dans le même gestionnaire je Réitérons par les ListViewDataItems et trouve le contrôle:
foreach (ListViewDataItem item in lvQuestions.Items)
{
HiddenField hdField = (HiddenField)item.FindControl("hfQuestionId");
PlaceHolder plcHolder = (PlaceHolder)item.FindControl("plControl");
TextBox txtbx = (TextBox)plcHolder.FindControl("txtQuestion_" + hdField.Value);
if (txtbx != null)
{
Response.Write("TextBox Found:" + txtbx.Text);
}
}
La zone de texte est trouvée, mais il n'y a pas de valeur. C'est comme si je venais d'écrire sur les zones de texte avec de nouvelles dans le bloc précédent. Si je supprime le bloc de code précédent, aucune zone de texte n'est trouvée.
Quelqu'un peut-il m'aider s'il vous plaît avec ce qui me manque ici?
Merci.
Merci Phaedrus, cela a fonctionné! Je ne lis jamais rien sur la création de mes contrôles dans l'événement ItemCreated. J'ai déplacé la création ici et supprimé mon bloc de code pour recréer les contrôles dans le gestionnaire de soumission de bouton. Merci encore. – DahlinDev