Domanda

Qualcuno può dirmi come posso arrivare a questo lavoro. Voglio distinguere i controlli a discesa all'interno di un controllo ripetitore. Capisco ora sulla ai cicli di vita e di come il buffer è già redigendi, ma quali sono le mie alternative? Ecco cosa accade

Codice File

    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>

restituisce questo errore

  

Messaggio parser di errore:. 'AdTitle <% #% Container.ItemIndex>' non è un identificatore valido

È stato utile?

Soluzione

  

Voglio distinguere discesa   controlli in un controllo ripetitore.

Non è necessario. Ecco alcuni esempi di codice che potrebbero aiutarti:

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

Altri suggerimenti

Non è possibile creare un ID univoco all'interno di un ripetitore attraverso il markup del genere. È tuttavia possibile recuperare la discesa nella codebehind utilizzando FindControl sulla Ripetitore.

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

Ok ... in poche parole non si può fare quello che stai cercando di fare in modo che si sta facendo.

  

La proprietà ID di un controllo può essere impostato solo con l'attributo ID nel tag e un valore semplice. Esempio: <asp:Button runat="server" id="Button1" />

Posso vedere che cosa il vostro cercando di fare, ma io in realtà non capisco perché ...

Un controllo ripetitore conterrà 1 articolo, per voce della tua origine dati, quindi è perfettamente bene di chiamare solo il tuo ID="AdTitle" DropDownList come quella sarà una 'AdTitle' diverso da quello nella riga successiva.

Per riaverli lato server, si sarebbe solo scorrere gli articoli nel ripetitore e FindControl("AdTitle") per ottenere il DropDownList specifica per tale voce.

Se è assolutamente necessario avere gli ID di incremento, avrete bisogno di fare questo a livello di codice (probabilmente sull'evento ItemDataBound di creare una DropDownList e aggiungerlo al tuo ItemTemplate.

Ampliando la risposta di BC: Recentemente ho avuto lo stesso problema, anche se con una casella di controllo, avevo bisogno di impostare l'ID come facevo che quando persistente scelte. Un po 'goffo ma l'ho fatto quando in Opzione Dati Bound.

Ecco il markup:

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

ho creato e legato una collezione di questa classe

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

Fare la necessaria Page Load

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

A seguire, questo, dove ho impostato 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();
        }
    }

Così, quando il pulsante di invio è colpito posso ciclo thru e afferrare l'Id di quelli controllati e risparmia:

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

Si potrebbe aggiungere un gestore di eventi per Repeater.ItemDataBound e creare il controllo all'interno del gestore utilizzando il riferimento al contenitore oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top