Usando Repetidor para una forma actualizable
-
22-09-2019 - |
Pregunta
Tengo una lista de los nombres de los parámetros para los que yo quiero un usuario escriba algunos valores, por lo que hago esto:
<div>
<asp:Repeater runat="server" ID="rptTemplateParams" EnableViewState="true">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:Label runat="server"><%#Container.DataItem%></asp:Label>
<asp:TextBox runat="server" ID="textParamValue"></asp:TextBox>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</div>
<asp:Button runat="server" ID="Send" Text="Send Email" OnClick="Send_Click" />
y en el lado del servidor:
void Page_Load(...)
{
rptTemplateParams.DataSource =Params; // Params is List<string>
rptTemplateParams.DataBind();
}
public void Send_Click(object sender, EventArgs e)
{
ParamDict = new Dictionary<string, string>();
foreach (RepeaterItem item in rptTemplateParams.Items)
{
if (item.ItemType == ListItemType.Item)
{
TextBox textParamValue = (TextBox)item.FindControl("textParamValue");
if (textParamValue.Text.Trim() != String.Empty)
{
// IT NEVER GETS HERE - textParamValue.Text IS ALWAYS EMPTY!!!
ParamDict.Add(item.DataItem.ToString(), textParamValue.Text);
}
}
}
}
Como me puso en el comentario, no puedo recuperar los valores de los cuadros de texto - que siempre están vacías. Am recuperar aquellos en el lugar equivocado?
Gracias! Andrey
Solución
Trate de modificar su Page_Load como esto
if(!Page.IsPostBack)
{
rptTemplateParams.DataSource =Params; // Params is List<string>
rptTemplateParams.DataBind();
}
El enlace de datos elimina los controles existentes y los reemplaza con nuevos controles en blanco. Sólo desea databind cuando sea necesario.
Otros consejos
intente lo siguiente:
void Page_Load(...)
{
if (!IsPostBack)
{
rptTemplateParams.DataSource =Params; // Params is List<string>
rptTemplateParams.DataBind();
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow