Come nido ripetitori asp.net

Ho bisogno di sapere come nido ripetitori all’interno di un controllo utente. Html lato delle cose è un bene, è il binding e il codice dietro ho bisogno di aiuto con. Io sono stato solo in grado di trovare esempi di utilizzo di un’origine dati sql, che non aiuta.

Mio ripetitori simile a questa:

<asp:Panel ID="pnlDiscipline" runat="server" CssClass="">
    <asp:Repeater ID="rptDiscipline" runat="server">
        <ItemTemplate>
            <h4><%#Eval("Discipline")%></h4>
            <ul>
                <asp:Repeater ID="rptPrograms" runat="server">
                    <ItemTemplate>
                        <li><asp:HyperLink runat="server" Text='<%#Eval("Name") %>' NavigateUrl='<%#Eval("Link") %>'></asp:HyperLink> <%#Eval ("Notation") %></li>
                    </ItemTemplate>
                </asp:Repeater>
            </ul>
        </ItemTemplate>
    </asp:Repeater>

Quello che devo fare spero sia abbastanza chiaro – h4 disciplina dovrebbe apparire una volta, tutte le voci che appartengono alla disciplina sono elencati di seguito, quindi la prossima h4, quindi l’apposito elenco, il prossimo h4 e così via.

L’origine dati è un dataview creato nel codebehind in cui ogni riga ha ‘Nome’, “Link’, ‘la Notazione’ e ‘Disciplina’. Ho legato il dataview verso l’esterno del ripetitore, e si comporta come previsto – elenca la disciplina del nome per ciascuna voce, ma non mostra dati interno del ripetitore.

Come posso fare per fare questo lavoro?

EDIT: Giusto per chiarire, ho un datatable nel code-behind. Ogni riga della tabella è un elemento, ogni elemento appartiene ad una disciplina. Voglio usare il ripetitore esterno per elencare le discipline, il interno per elencare gli elementi raggruppati sotto ogni disciplina. In questo modo:

<h4>DISCIPLINE 1</h4>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>
<h4>DISCIPLINE 2</h4>
    <ul>        
        <li>Item</li>            
        <li>Item</li>
    </ul>
<h4>DISCIPLINE 3</h4>
    <ul>        
        <li>Item</li>            
        <li>Item</li>
    </ul>

Attualmente, l’associazione datatable all’esterno ripetitore dà questo (esempio usa i dati in alto):

    <h4>DISCIPLINE 1</h4>
    <h4>DISCIPLINE 1</h4>
    <h4>DISCIPLINE 1</h4>
    <h4>DISCIPLINE 2</h4>
    <h4>DISCIPLINE 2</h4>
    <h4>DISCIPLINE 3</h4>
    <h4>DISCIPLINE 3</h4>

Ho usato OnItemDataBound sull’esterno ripetitore come suggerito, e come un caso di test sono in grado di accedere ai dati:

protected void rptDiscipline_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{
    DataRowView drView = (DataRowView) e.Item.DataItem;
    string name = drView["Name"] as string;
    string link = drView["Link"] as string;
    string notation = drView["Notation"] as string;
    Response.Write(name + link + notation + "<br />")
}

In modo che i dati c’è, è esattamente quello che mi sarei aspettato di vedere, ho appena non può ottenere è legato all’interno del ripetitore. Se c’è una più performante modo per ottenere lo stesso, sono felice di rielaborare la mia soluzione.

  • è possibile ottenere l’idea di questo thread stackoverflow.com/questions/1220715/…
  • cosa stai cercando di legarsi all’interno del ripetitore? magari posta la classe che si sono vincolanti per l’esterno del ripetitore.
  • modificato la mia domanda, sperando che chiarisce il mio problema
InformationsquelleAutor Nathan | 2011-05-30



3 Replies
  1. 7

    Sul pannello di controllo esterno, utilizzare l’evento ItemDataBound, come questo:

    <asp:Repeater ID="rptDiscipline" runat="server"
         OnItemDataBound="rptDiscipline_ItemDataBound">
    ...

    Poi, nel code-behind, gestire il rptDiscipline_ItemDataBound evento e manualmente associare interno del ripetitore. Il ripetitore evento ItemDataBound fuochi di una volta per ogni elemento che si ripete. Così potrai fare qualcosa di simile a questo:

    protected void rptDiscipline_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
    {
        //To get your data item, cast e.Item.DataItem to 
        //whatever you're using for the data object; for example a DataRow.
    
        //Get the inner repeater:
        Repeater rptPrograms = (Repeater) e.Item.FindControl("rptPrograms");
    
        //Set the inner repeater's datasource to whatever it needs to be.
        rptPrograms.DataSource = ...
        rptPrograms.DataMember = ...
        rptPrograms.DataBind();
    }

    EDIT: Aggiornato per abbinare la vostra domanda di aggiornamento.

    È necessario associare l’esterno ripetitore a un’origine dati che ha un solo record per ogni elemento che si desidera che il ripetitore per il rendering. Ciò significa che l’origine dati deve essere una raccolta/elenco/datatable/ecc che ha solo le discipline in esso. Nel tuo caso, mi sento di raccomandare di ottenere un List<string> di discipline, dal DataTable per l’interno di raccolta e collegamento esterno al ripetitore di che. Poi, all’interno del ripetitore si lega a un sottoinsieme di dati in un oggetto DataTable, utilizzando l’evento ItemDataBound. Per ottenere il sottoinsieme, filtro DataTable attraverso un DataView.

    Ecco il codice:

    protected void Page_Load(object sender, EventItems e)
    {
        //get your data table
        DataTable table = ...
    
        if ( !IsPostBack )
        {
            //get a distinct list of disciplines
            List<string> disciplines = new List<string>();
            foreach ( DataRow row in table )
            {
                string discipline = (string) row["Discipline"];
                if ( !disciplines.Contains( discipline ) )
                    disciplines.Add( discipline );
            }
            disciplines.Sort();
    
            //Bind the outer repeater
            rptDiscipline.DataSource = disciplines;
            rptDiscipline.DataBind();
        }
    }
    
    protected void rptDiscipline_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
    {
        //To get your data item, cast e.Item.DataItem to 
        //whatever you're using for the data object
        string discipline = (string) e.Item.DataItem;
    
        //Get the inner repeater:
        Repeater rptPrograms = (Repeater) e.Item.FindControl("rptPrograms");
    
        //Create a filtered view of the data that shows only 
        //the disciplines needed for this row
        //table is the datatable that was originally bound to the outer repeater
        DataView dv = new DataView( table );  
        dv.RowFilter = String.Format("Discipline = '{0}'", discipline);
    
        //Set the inner repeater's datasource to whatever it needs to be.
        rptPrograms.DataSource = dv;
        rptPrograms.DataBind();
    }   
    • Può essere fatto attraverso la creazione dell’Origine dati all’interno del ripetitore?
    • Ciao @charlie – capisco ciò che vuoi dire, ma non riesco a farla funzionare. Puoi approfondire la tua risposta?
    • Sì, è possibile, vedere @lomaxx risposta
    • che è assolutamente bellissimo. Ero troppo concentrata su associazione il singolo oggetto datatable piuttosto che creare la disciplina di elenco, pur vedendo un sacco di sql esempi di utilizzo di due tabelle con una relazione definita. Davvero, davvero apprezzare la guida su questo, il presente codice verrà incredibilmente utile in futuro.
  2. 4

    Se non volete farlo in l’evento ItemDataBound, puoi anche farlo inline nella pagina di associazione a un bambino di proprietà dell’elemento principale se il bambino struttura è una collezione in questo modo:

    <asp:Repeater runat="server" ID="OuterRepeater" >
        <ItemTemplate>
            Outer Content: <%# DataBinder.Eval(Container.DataItem, "ParentProperty")%>
            <asp:Repeater runat="server" ID="InnerRepeater" DataSource='<%# DataBinder.Eval(Container.DataItem, "ChildCollection")%>' >
                <ItemTemplate>
                    <%# DataBinder.Eval(Container.DataItem, "ChildProperty")%>
                </ItemTemplate>
            </asp:Repeater>
        </ItemTemplate>
    </asp:Repeater>
  3. 1

    Prima avete bisogno di due elenchi, l’elenco delle discipline, e quindi l’elenco di tutti i vostri dati.

    Dati associare l’elenco delle discipline per l’esterno del ripetitore. Se ci sono 6 discipline, il ripetitore dovrebbe ripetere 6 volte.

        <asp:Repeater ID="rptDiscipline" runat="server" OnItemDataBound="rptDiscipline_ItemDataBound">
            <ItemTemplate>
                <h4><%# Eval("Discipline")%></h4>
                <ul>
                    <asp:Repeater runat="server" ID="InnerRepeater" >
                        <ItemTemplate>
                            <li>
                                <asp:Label runat="server" ID="lbl" />
                            </li>
                        </ItemTemplate>
                    </asp:Repeater>
                </ul>
            </ItemTemplate>
        </asp:Repeater>
    
    protected void rptDiscipline_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
    {    
    
        Repeater inner= (Repeater) e.Item.FindControl("InnerRepeater");
    
        //You want to bind all the data related to this discipline
        DataRowView drView = (DataRowView) e.Item.DataItem;
        string discipline= drView["Discipline"] as string;
    
        //filter your total data with ones that match the discipline
    
        inner.DataSource = //data bind the filtered list here
        inner.DataBind();
    }
    • Io non sono preoccupato come posso ottenere it – il pensiero di nidificazione sarebbe una soluzione, se non che è un bene per me. Il tuo esempio non produce l’output sto inseguendo – ho bisogno di un elenco di ‘nome’ raggruppate per disciplina – sono 150 le righe nel datatable, ciascuna con un nome univoco e una delle sei discipline.
    • Penso di capire il tuo problema… io ho postato alcuni psudo codice

Lascia un commento