Pregunta

Puede alguien decirme cómo puedo conseguir que esto funcione. Quiero distinguir los controles desplegables dentro de un control repetidor. Ahora entiendo sobre el Ciclo de Vida y como ya se writen el buffer, pero ¿cuáles son mis alternativas? Esto es lo que sucede

Código Archivo

    Dim repeatTimes((TotalAdInsured - 1)) As Integer

    myRepeater.DataSource = repeatTimes
    myRepeater.DataBind()

Aspfile

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
         <asp:DropDownList ID="AdTitle<%# Container.ItemIndex %>" runat="server">
             <asp:ListItem Selected="True" Value="" Text=""/>
             <asp:ListItem Selected="False" Value="Miss" Text="Miss"/>
             <asp:ListItem Selected="False" Value="Ms" Text="Ms"/>
             <asp:ListItem Selected="False" Value="Mrs" Text="Mrs"/>
             <asp:ListItem Selected="False" Value="Mr" Text="Mr"/>
             <asp:ListItem Selected="False" Value="Other" Text="Other"/>
         </asp:DropDownList>
    </ItemTemplate>
</asp:Repeater>

Devuelve este error

  

Mensaje de error del Analizador:. 'AdTitle <% # Container.ItemIndex%>' no es un identificador válido

¿Fue útil?

Solución

  

Quiero distinguir desplegable   controles dentro de un control de repetidor.

No es necesario. He aquí algunos ejemplos de código que podría ayudarle a cabo:

Marcado:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" ID="lblMsg" Text="Click a button" />
        <hr />
        <asp:Repeater runat="server" ID="rptAwesome" onitemcommand="rptAwesome_ItemCommand"
            >
            <ItemTemplate>
                <asp:Button runat="server" ID="btnAwesome"
                    Text='<%# "Button #" + Container.ItemIndex %>'
                    CommandArgument='<%# Container.DataItem %>'/><br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

Codebehind:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var x = new int[] { 1, 2, 3, 4, 5 };
            rptAwesome.DataSource = x;
            rptAwesome.DataBind();
        }
    }
    protected void rptAwesome_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Button btnAwesome = (Button)e.CommandSource;
        lblMsg.Text = string.Format("btnAwesome.ID = {0}, e.CommandArgument = {1}", btnAwesome.ID, e.CommandArgument);
    }
}

Otros consejos

No se puede crear un identificador único dentro de un repetidor a través del marcado de esa manera. Sin embargo, puede recuperar el menú desplegable en el código subyacente mediante el uso de FindControl en el repetidor.

Dim adTitle As DropDownList = MyRepeater.FindControl("AdTitle")
If (Not adTitle Is Nothing) Then
  ''Do something here
End If

Ok ... en pocas palabras, no se puede hacer lo que estamos tratando de hacer de la manera que está haciendo actualmente.

  

La propiedad ID de un control sólo se puede establecer utilizando el atributo ID de la etiqueta y un valor simple. Ejemplo: <asp:Button runat="server" id="Button1" />

Puedo ver lo que su tratando de hacer, pero yo realmente no entiendo por qué ...

Un control del repetidor contendrá 1 artículo, por artículo en su fuente de datos, por lo que es perfectamente posible simplemente llame a su ID="AdTitle" DropDownList ya que habrá un 'AdTitle' diferente a la de la fila siguiente.

Para recuperarlos del lado del servidor, usted acaba de recorrer a través de los artículos en tu repetidor y FindControl("AdTitle") para obtener el DropDownList específica para ese elemento.

Si es absolutamente necesario contar con los ID de incremento, que tendrá que hacer esto mediante programación (probablemente en el caso ItemDataBound para crear un DropDownList y añadirlo a su ItemTemplate.

Ampliando la respuesta de AC: Hace poco tuve el mismo problema, aunque con una casilla de verificación, que tenía que poner la identificación como antes que cuando la persistencia de opciones. Un poco torpe, pero lo hice cuando el Elemento Datos Bound.

Aquí está el marcado:

<asp:Repeater ID="Repeater1" runat="server" >
<HeaderTemplate>Header<br /><br /></HeaderTemplate>
<ItemTemplate>
    <asp:CheckBox ID="cb" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
     ...other controls removed for brevity
</ItemTemplate>
<FooterTemplate>
    <asp:Button ID="Button1" runat="server" OnClick="Submit" Text="Submit" />
</FooterTemplate>
</asp:Repeater>

He definido y encuadernado una colección de esta clase

public class mst
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public bool NumberRequired { get; set; }
}

Haga lo necesario en Load

        Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound);
        Repeater1.DataSource = listOfMsts;
        Repeater1.DataBind();

Seguido por, este donde Set ID:

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var mst = (mst)e.Item.DataItem;
            ((CheckBox)e.Item.FindControl("cb")).ID = mst.Id.ToString();
        }
    }

Así que cuando se golpea el botón de envío que puede recorrer a través y agarrar la identificación de los controlados y guardar:

  protected void Submit(object sender, EventArgs e)
    {
    foreach (var item in Repeater1.Items)
        {
            var checkboxes = ((RepeaterItem)item).Controls.OfType<CheckBox>().ToList();
            if (checkboxes[0].Checked)
            {
                Save(checkboxes[0].ID);
                ....other stuff
            }
        }
    }

Se podría añadir un controlador de eventos para Repeater.ItemDataBound y crear el control dentro del controlador usando la referencia al contenedor de material.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top