Question

Quelqu'un peut-il me dire comment je peux obtenir ce travail. Je veux distinguer les contrôles déroulant dans un contrôle répéteur. Je comprends maintenant sur le Lifecyle et comment le tampon est déjà writen, mais quelles sont mes alternatives? Voici ce qui se passe

Code de fichier

    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>

retour cette erreur

  

Parser Message d'erreur:. 'AdTitle <% # Container.ItemIndex%>' est pas un identifiant valide

Était-ce utile?

La solution

  

Je veux distinguer menu déroulant   contrôles à l'intérieur d'une fonction de répétition.

Vous n'avez pas besoin. Voici quelques exemples de code qui pourraient vous aider:

Markup:

<%@ 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);
    }
}

Autres conseils

Vous ne pouvez pas créer un identifiant unique à l'intérieur d'un répéteur à travers le balisage comme ça. Vous pouvez cependant récupérer le menu déroulant dans le codebehind en utilisant FindControl sur la répéteur.

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

Ok ... en un mot que vous ne pouvez pas faire ce que vous essayez de faire de la manière que vous faites actuellement il.

  

La propriété ID d'un contrôle ne peut être réglé en utilisant l'attribut ID dans la balise et une valeur simple. Exemple: <asp:Button runat="server" id="Button1" />

Je peux voir ce que vous essayez de faire, mais je ne comprends pas vraiment pourquoi ...

Un contrôle répéteur contiendra 1 pièce, par article dans votre source de données, il est donc parfaitement bien appeler simplement votre DropDownList ID="AdTitle" que ce sera un 'AdTitle' différent de celui de la ligne suivante.

Pour les récupérer côté serveur, vous simplement itérer les éléments de votre répéteur de FindControl("AdTitle") pour obtenir le DropDownList spécifique pour cet élément.

S'il est absolument nécessaire d'avoir les ID incrémentée, alors vous aurez besoin de faire ce programme (probablement l'événement ItemDataBound pour créer un DropDownList et l'ajouter à votre ItemTemplate.

L'expansion sur la réponse de la Colombie-Britannique: J'ai eu récemment la même question, mais avec une case à cocher, je devais définir l'ID comme je que lors de la persistance des choix. Un peu maladroit, mais je l'ai fait quand sur les données de l'article lié.

Voici le balisage:

<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>

Je mis en place et lié une collection de cette classe

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

Faites le nécessaire Page_Load

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

Suivi par ce Où je 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();
        }
    }

Ainsi, lorsque le bouton d'envoi est boucle frappé que je peux à travers et saisir l'identifiant de ceux vérifiés et enregistrer:

  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
            }
        }
    }

Vous pouvez ajouter un gestionnaire d'événements à Repeater.ItemDataBound et créer le contrôle dans le gestionnaire en utilisant la référence au conteneur de l'élément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top