Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Controllo If in Repeater e DataBinder.Eval

    ciao!

    sostanzialmente, dentro ad un Repeater che prende dati da un db, dovrei fare una cosa del genere:
    codice:
                                      <% If (DataBinder.Eval(Container.DataItem, "UpTipo") = "") %>
                                                    <a href="...." title="">
                                                        <div class="img-fluid">
                                                            <i class="far fa-eye fa-2x"></i>
                                                        </div>
                                                    </a>
                                                    <% Else %>
                                                    <button type="button" class="btn btn-sm btn_upl"
                                                        data-id="<%# DataBinder.Eval(Container.DataItem, "UpNome") %>"
                                                        data-type="<%# DataBinder.Eval(Container.DataItem, "UpTipo") %>">
                                                        <i class="far fa-eye fa-2x"></i>
                                                    </button>
                                                    <% End If %>
    ma mi da errore:
    codice:
    Errore di compilazione
    
    Descrizione: Errore durante la compilazione di una  risorsa necessaria per soddisfare la richiesta. Rivedere i dettagli  relativi all'errore e modificare in modo appropriato il codice sorgente.             
    Messaggio di errore del compilatore: BC30451: 'Container' non dichiarato. Potrebbe non essere accessibile a causa del relativo livello di protezione.
    come dovrei fare??

  2. #2

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    fermat, quello che vuoi ottenere si puo' fare dal metodo ItemDataBound del Repeater.

    comunque, riguardo la sintassi su cui c'e' confusione, di seguito un esempio che funziona ("NOME_PRODOTTO" è una colonna di una tabella che viene letta e messa come datasource al Repeater nel Code-Behind).

    La funzione Choose fa una semplice cernita fra i valori che contengono la parola "lavatrice".

    Al placeholder che vedi, nell'evento ItemDataBound, viene aggiunto un controllo (IDPlaceholder.Controls.Add) a seconda di una logica custom, che puo' essere una qualsiasi.


    La pagina ASPX:
    codice:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="repeaterExample.aspx.cs" Inherits="repeaterExample" %>
    
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <script runat="server">
            public string Choose(string x)
            {
                if (x.Contains("lavatrice"))
                    return x;
                else
                    return "non contiene la parola cercata";
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_ItemDataBound">
                    <ItemTemplate>
                        <asp:Label ID="lb" 
                            Text='<%# Choose(DataBinder.Eval(Container.DataItem, "NOME_PRODOTTO").ToString()) %>' 
                            runat="server"></asp:Label>
                        
                        <asp:PlaceHolder ID="ph" runat="server"></asp:PlaceHolder>
                    </ItemTemplate>
                    <SeparatorTemplate><hr /><br /></SeparatorTemplate>
                </asp:Repeater>
            </div>
        </form>
    </body>
    </html>


    L'evento citato, nel Code-Behind:
    codice:
    protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Label lb = new Label();
            lb = (Label)e.Item.FindControl("lb");
    
    
            if (lb.Text.Contains("lavatrice"))
            {
                // 
                // Aggiunta di un controllo di esempio al placeholder
                //
                System.Web.UI.HtmlControls.HtmlButton b = new System.Web.UI.HtmlControls.HtmlButton();
                b.ID = "bt";
                b.InnerText = "Bottone aggiunto da codice";
    
    
                PlaceHolder ph = new PlaceHolder();
                ph = (PlaceHolder)e.Item.FindControl("ph");
                ph.Controls.Add(b);
            }
        }
    }


    La cosa da tenere a mente, col secondo metodo, è ricreare i controlli creati a runtime, che non è cosa da poco quando sono tanti (e neanche quando non lo sono, a dire il vero). Prova, e ricorda di riprodurre gli stessi ID della prima creazione (qui vado a memoria).

    Effettivamente, su questo asp.net è un po' rognoso. Comunque la sintassi per togliere quell'errore è nel primo blocco di codice
    Ultima modifica di djciko; 28-11-2019 a 17:52

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.