Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: Repeater e Button

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    226

    Repeater e Button

    Ciao
    ho un controllo repeater che uso da parecchio tempo, ora ho l'esigenza di inserire per ogni riga una text box vuota (dove andrà inserito un numero dall'utente) e un button.
    Alla pressione del button dovrei richiamare un valore della riga per modificare i dati a database.

    Non so come fare.

    Il controllo repeater lo istanzio così:
    codice:
    <asp:Repeater ID="MyRepeater" runat="server">
             
             <HeaderTemplate>
            <table width="90%"  border="0" class="bordo1_gall">
              <tr>
                <td colspan="2"></td>
                           
              </tr>
                    
            </HeaderTemplate>
             
             <ItemTemplate>
             
             <tr>
             <td width="65"  align="center" valign="middle" class="row_bord IM3" ><%#DataBinder.Eval(Container.DataItem, "Immagine")%></td>
            
             <td  class="row_bord">
            <table width="90%" border="0" class="testo10">
             
                      <td width="5%" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "cod")%></td>
                    <td width="68%" rowspan="2" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "Nome")%></td>
                    <td width="10%" class="galleria">Prezzo : </td>
                    <td width="17%"  class="galleria2"><%#DataBinder.Eval(Container.DataItem, "Prezzo")%></td>
                  </tr>
                  <tr>
                    <td class="galleria2"></td>
                    <td class="galleria2"></td>
                    <td class="galleria2"></td>
                  </tr>
                  <tr>
                    <td class="galleria2"></td>
                    <td width="68%" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "Descrizione")%></td>
                    <td class="galleria">Qta:</td>
                    <td class="galleria2">TEXT BOX + BOTTONE</td>
                  </tr>
               </table>
               </td>
            
              </tr>
             
             <%--<%#DataBinder.Eval(Container.DataItem, "Descrizione")%>--%>
            </ItemTemplate>        
                    
             <FooterTemplate >
               
             <tr>
                <td height="10" class="row_bord"></td>
                <td height="10" class="row_bord"></td>
              </tr>
            </table>
             
             
            </FooterTemplate>
              
             </asp:Repeater>
    Il vb lo prendo da una DataTableCollection
    e poi
    dt = RicercaProdotti("", "")
    MyRepeater.DataSource = dt.Item(0)
    MyRepeater.DataBind()



    Potete aiutarmi ad inserire la text box ed il button e a capire come recuperare poi la riga alla pressione del button.

    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541

    Re: Repeater e Button

    Originariamente inviato da s.ef
    Ciao
    ho un controllo repeater che uso da parecchio tempo, ora ho l'esigenza di inserire per ogni riga una text box vuota (dove andrà inserito un numero dall'utente) e un button.
    Alla pressione del button dovrei richiamare un valore della riga per modificare i dati a database.

    Non so come fare.

    Il controllo repeater lo istanzio così:
    codice:
    <asp:Repeater ID="MyRepeater" runat="server">
             
             <HeaderTemplate>
            <table width="90%"  border="0" class="bordo1_gall">
              <tr>
                <td colspan="2"></td>
                           
              </tr>
                    
            </HeaderTemplate>
             
             <ItemTemplate>
             
             <tr>
             <td width="65"  align="center" valign="middle" class="row_bord IM3" ><%#DataBinder.Eval(Container.DataItem, "Immagine")%></td>
            
             <td  class="row_bord">
            <table width="90%" border="0" class="testo10">
             
                      <td width="5%" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "cod")%></td>
                    <td width="68%" rowspan="2" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "Nome")%></td>
                    <td width="10%" class="galleria">Prezzo : </td>
                    <td width="17%"  class="galleria2"><%#DataBinder.Eval(Container.DataItem, "Prezzo")%></td>
                  </tr>
                  <tr>
                    <td class="galleria2"></td>
                    <td class="galleria2"></td>
                    <td class="galleria2"></td>
                  </tr>
                  <tr>
                    <td class="galleria2"></td>
                    <td width="68%" class="galleria3"><%#DataBinder.Eval(Container.DataItem, "Descrizione")%></td>
                    <td class="galleria">Qta:</td>
                    <td class="galleria2">TEXT BOX + BOTTONE</td>
                  </tr>
               </table>
               </td>
            
              </tr>
             
             <%--<%#DataBinder.Eval(Container.DataItem, "Descrizione")%>--%>
            </ItemTemplate>        
                    
             <FooterTemplate >
               
             <tr>
                <td height="10" class="row_bord"></td>
                <td height="10" class="row_bord"></td>
              </tr>
            </table>
             
             
            </FooterTemplate>
              
             </asp:Repeater>
    Il vb lo prendo da una DataTableCollection
    e poi
    dt = RicercaProdotti("", "")
    MyRepeater.DataSource = dt.Item(0)
    MyRepeater.DataBind()



    Potete aiutarmi ad inserire la text box ed il button e a capire come recuperare poi la riga alla pressione del button.

    Grazie a tutti.
    per fare questo c'è il datagrid.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    226
    Non si può proprio fare con il repeater....
    altrimenti devo cambiare molte pagine ..... la grafica dovrebbe essere uguale per tutte e non riesco a riprodurre la stessa identica grafica... ci ho provato ma non ci sono riuscita.

  4. #4
    Utente di HTML.it L'avatar di ybla82
    Registrato dal
    Jan 2009
    Messaggi
    92
    Ciao,
    potresti risolvere usando questi due eventi dell'oggetto Repeater:

    codice:
    OnItemDataBound
    OnItemCommand
    Ti spiego di seguito una possibilità per ottenere il funzionamento desiderato.
    Ogni Button ha due attributi:
    codice:
    CommandName
    CommandArgument
    CommandName impostalo a "SalvaDati",
    A Command argument invece assegna un valore differente ad ogni sua istanza ( quindi ad ogni riga, ad esempio un ID ( se salvi nel db devi usare per forza una qualche chiave, e il valore della chiave potrebbe andare bene)
    Per fare questo usi l'evento OnItemDataBound. La funzione sottoscritta a questo evento viene chiamata per ogni elemento bindato al repeater ( compreso Header e Footer).

    Avrai una cosa del genere quindi:

    codice:
    protected void MyRepater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
    {
            if ((e.Item != null) && ((e.Item.ItemType == ListItemType.Item)) || (e.Item.ItemType == ListItemType.AlternatingItem))
            {
                if ((e.Item != null) && ((e.Item.ItemType == ListItemType.Item)) || (e.Item.ItemType == ListItemType.AlternatingItem))
                {
    
                    ((Button)e.Item.FindControl("MyButton")).CommandArgument =          //valore univoco che assegni                   
                }
    
            }
        }

    Fatto questo,
    sottoscrivi una funzione all'evento OnItemCommand.

    Questo evento viene chiamato quando viene eseguito un comando sul repeater ( in questo caso la pressione del bottone alla n-esima riga).

    Dentro la funzione quindi farai un check su CommandArgument e CommandName e in questo modo dovresti essere in grado di estrarre tutti i dati che ti servono.

    codice:
    protected void MyRepeater_OnItemCommand(object sender, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "SalvaDati")
            {
                  object oMyPrimaryKey = e.CommandArgument;
            }
        }

    Spero che sia tutto chiaro.

    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    226
    ho provato ... io non programmo in c, quindi ho dovuto modificare il codice... però c'è ancora qualcosa che non funziona....

    Ho modificato così il repeater :
    <asp:Repeater ID="MyRepeater" runat="server" OnItemDataBound="MyRepeater_OnItemDataBound" >

    Poi il botton l'ho instanziato così:
    <asp:Button ID="removeEmail" CommandName="Ordina" CommandArgument=<%#DataBinder.Eval(Container.DataI tem, "id") %> runat="server" Text="X" ToolTip="remove" />

    Nel campo id c'è l'identificativo univoco della riga.

    Ora quando lancio il debug al caricamento del repeater ad ogni riga entra nel sub:
    Public Sub MyRepeater_OnItemDataBound(ByVal Sender As Object, ByVal e As RepeaterItemEventArgs)

    End Sub

    Poi una volta caricata la pagina non ci entra più.... ad ogni pressione del tasto non succede niente e la pagina viene ricaricata da 0.

    Inoltre non mi riconosce il comando
    e.CommandArgument



    Devo sicuramente aver sbagliato qualcosa...... ma non riesco a trovare un esempio concreto che utilizzi correttamente le classi segnalate.

  6. #6
    Utente di HTML.it L'avatar di ybla82
    Registrato dal
    Jan 2009
    Messaggi
    92
    ciao,

    il codice che ti ho postato è per il C#, ma non credo che si scosti molto dal VB.

    Da quel che ho visto non hai sottoscritto alcun metodo per l'evento OnItemCommand.

    Quindi fai così:

    codice:
    <asp:Repeater ID="MyRepeater" runat="server" OnItemDataBound="MyRepeater_OnItemDataBound" OnItemCommand="MyRepeater_OnItemCommand" >
    E' normale poi che la funzione legata all'evento OnItemDataBound non venga più richiamata: in pratica l'evento che lancia la funzione in questione si ha quando chiama la DataBind() sulla Source del Repetater.

    e.CommandArgument non è un comando.

    codice:
    e
    è il parametro della funzione e
    codice:
    CommandArgument
    è una sua proprietà.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    226
    ok
    adesso provo :-)

    Volevo chiedere anche un'altra cosa ??? Dovrei inserire una textBox per ogni riga, vuota, in cui inserire un valore numerico....
    Funziona allo stesso modo ?
    Oppure ci sono delle classi diverse da utilizzare?

  8. #8
    Utente di HTML.it L'avatar di ybla82
    Registrato dal
    Jan 2009
    Messaggi
    92
    si si, funziona allo stesso modo.

    Per capirci, ogni Item del repeater, e quindi ogni riga, è un contenitore. Dentro ci puoi mettere qualsiasi cosa,e poi richiamare l'oggetto come ti ho mostrato nel codice precedente.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    226
    ho provato...... ma non mi riesce :-(

    <asp:Repeater ID="MyRepeater" runat="server" onItemDataBound="MyRepeater_OnItemDataBound" onItemCommand="MyRepeater_OnItemCommand" >


    In Vb ho importato la classe : Imports System.Web.UI.WebControls
    Anche se mi sembrava già ci fosse.

    Il codice Vb è :
    Public Sub MyRepeater_OnItemDataBound(ByVal Sender As Object, ByVal e As CommandEventArgs)
    Dim pippo As String
    pippo = e.CommandArgument
    End Sub


    Public Sub MyRepeater_onItemCommand(ByVal Sender As Object, ByVal e As CommandEventArgs)
    Dim pippo As String
    pippo = e.CommandArgument
    End Sub



    Mi dà questo errore....
    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: BC31143: La firma del metodo 'Public Sub MyRepeater_OnItemDataBound(Sender As Object, e As System.Web.UI.WebControls.CommandEventArgs)' non è compatibile con il delegato 'Delegate Sub RepeaterItemEventHandler(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs)'.

    Errore nel codice sorgente:


    Riga 49:

    Riga 50: <h2> <asp:Literal ID="Cod2" runat="server"></asp:Literal></h2>
    Riga 51: <asp:Repeater ID="MyRepeater" runat="server" onItemDataBound="MyRepeater_OnItemDataBound" onItemCommand="MyRepeater_OnItemCommand" >
    Riga 52:
    Riga 53: <HeaderTemplate>



    Ho fatto numerose prove, ma senza risultato. L'errore è sempre allo stesso punto della pagina.


    Dove continuo a sbagliare ?

  10. #10
    Utente di HTML.it L'avatar di ybla82
    Registrato dal
    Jan 2009
    Messaggi
    92
    allora,
    secondo me dobbiamo andare con un pochino di calma.

    Innanzitutto ti devi rendere conto di quello che stai facendo per capire dove stai sbagliando.

    Finora quello che hai fatto è stato sottoscrivere due metodi a due eventi distinti: questo server per far si che quando capita una determinata cosa, l'esecuzione della pagina entri nel codice della funzione legata all'evento.

    MyRepeater_OnItemDataBound è un metodo legato all'evento onItemDataBound: questo evento è scatenato ogni qualvolta una riga del repeater viene associata ad un dato della collezione che gli hai passato ( DataSource).

    MyRepeater_OnItemCommand è un metodo legato all'evento onItemCommand: questo evento è scatenato ogni qualvolta venga richiesta l'esecuzione di un comando presente dentro una delle righe del Repeater, nel caso in oggetto la pressione del pulsante.

    Detto questo, veniamo all'errore.

    Il compialtore ti dice:
    codice:
    MyRepeater_OnItemDataBound(Sender As Object, e As System.Web.UI.WebControls.CommandEventArgs)' non è compatibile con il delegato.
    Vuol dire che il metodo che hai dichiarato non è compatibile con il tipo di evento.
    O meglio: il delegate è il "tipo" dell'evento, ti dice cioè che tipo di funzioni possono essere accettate. nel tuo caso hai sbagliato il tipo di parametri della funzione.

    La funzione corretta è:
    codice:
    MyRepeater_OnItemDataBound(Sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs)

    E' da correggere anche l'altro metodo:

    codice:
    MyRepeater_onItemCommand(Sender As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs)
    Mi raccomando, se non sei sicuro di come funziona un evento, c'è sempre l' MSDN


    Spero con questo di averti sistemato un po' di cose.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.