2009-05-31 12 views
2

Quelqu'un peut-il me dire comment je peux faire fonctionner cette fonction? Je veux distinguer les commandes déroulantes à l'intérieur d'un contrôle de répéteur. Je comprends maintenant le mode de vie et comment le tampon est déjà écrit, mais quelles sont mes alternatives? Voici ce qui se passeASP.NET Modifier l'ID de contrôle de liste déroulante à l'intérieur de l'élément de répéteur de façon dynamique

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> 

Retours cette erreur

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

Répondre

5

Je veux distinguer dropdown commandes dans un répéteur con trol.

Vous n'en 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); 
    } 
} 
0

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.

1

Ok ... en un mot, vous ne pouvez pas faire ce que vous essayez de faire comme vous le faites actuellement.

La propriété ID d'une commande ne peut être définie qu'à l'aide de l'attribut ID de la variable et d'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 d'appeler simplement votre DropDownList ID="AdTitle" car ce sera un 'AdTitle' différent de celui de la rangée suivante. Pour les récupérer côté serveur, il vous suffit de parcourir les éléments de votre répéteur & FindControl("AdTitle") pour obtenir le DropDownList spécifique à cet élément.

S'il est absolument nécessaire d'avoir les ID incrémenter, vous devez faire ce programme (probablement sur le

3
événement ItemDataBound pour créer un DropDownList et l'ajouter à votre ItemTemplate.

Vous ne pouvez pas créer un identifiant unique à l'intérieur 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 le répéteur.

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

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 nécessaire pour définir l'ID tel que je l'ai utilisé lorsque les choix persistants. Un peu maladroit mais je l'ai fait quand sur Item Data Bound.

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

faire le nécessaire dans Page_Load

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

Suivie , ceci où Je mets 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 je peux frapper à travers et saisir l'identifiant de ceux vérifiés et économisez:

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