126 messaggi dal 05 agosto 2013
nella funzione Itemdatabound come posso far colorare l'intera riga i base ad un IF
11.511 messaggi dal 09 febbraio 2002
Contributi
Ciao,
intendi l'ItemDataBound di un DataGrid? Se ci fai caso, nella Sub che gestisce l'evento, hai un parametro chiamato "e" di tipo DataGridItemEventArgs. Quello ti permette di accedere sia all'oggetto legato alla riga, che userai nella condizione del tuo If, e sia alla riga stessa, così che potrai colorarla.


L'effettivo codice dipende da cosa hai impostato come DataSource: un DataTable o una lista di oggetti?

Se è un DataTable prova così:
    Protected Sub Unnamed_ItemDataBound(sender As Object, e As DataGridItemEventArgs)
        'Agisco solo se Item o AlternatingItem e non su righe di header o footer
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            'Qui va la tua condizione
            If e.Item.DataItem("Campo") = "Valore" Then
                'Qui colori
                e.Item.BackColor = Drawing.Color.Red
            End If
        End If
    End Sub


Se è una lista di oggetti prova:
    Protected Sub Unnamed_ItemDataBound(sender As Object, e As DataGridItemEventArgs)
        'Agisco solo se Item o AlternatingItem e non su righe di header o footer
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            'Qui va la tua condizione
            If CType(e.Item.DataItem, NomeTuaClasse).NomeTuaProprietà = "Valore" Then
                'Qui colori
                e.Item.BackColor = Drawing.Color.Red
            End If
        End If
    End Sub


ciao,
Moreno

Enjoy learning and just keep making
126 messaggi dal 05 agosto 2013
BrightSoul ha scritto:

e.Item.BackColor = Drawing.Color.Red
[/code]

dice che backcolor non è un me3mbro di repeaterItem
11.511 messaggi dal 09 febbraio 2002
Contributi
Ok, infatti come dicevo non ero sicuro che tu stessi usando un DataGrid. Quindi stai usando un Repeater, bene, ma per cortesia ti chiedo di essere più preciso la prossima volta dato che sto investendo del tempo per inviarti una risposta.

Per prima cosa devi andare nell'ItemTemplate del tuo Repeater e aggiungere un controllo che si possa colorare, come ad esempio un asp:Panel. Ecco un esempio:
    <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
        <ItemTemplate>
            <asp:Panel ID="Contenitore" runat="server">
                <!-- Metti il tuo attuale contenuto qui, all'interno del panel -->
            </asp:Panel>
        </ItemTemplate>
    </asp:Repeater>


Poi vai nella Sub che gestisce l'evento e ottieni un riferimento al Panel per colorarlo. Come al solito la sintassi cambia in base a se stai usando un DataTable o una lista di oggetti. Fammi sapere per cortesia cosa stai impostando come DataSource.

In caso di DataTable:
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            If e.Item.DataItem("Campo") = "Valore" Then
                CType(e.Item.FindControl("Contenitore"), Panel).BackColor = Drawing.Color.Red
            End If
        End If


In caso di lista di oggetti:
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            If CType(e.Item.DataItem, NomeTuaClasse).NomeTuaProprietà = "Valore" Then
                CType(e.Item.FindControl("Contenitore"), Panel).BackColor = Drawing.Color.Red
            End If
        End If


ciao,
Moreno
Modificato da BrightSoul il 03 marzo 2019 11:05 -

Enjoy learning and just keep making
126 messaggi dal 05 agosto 2013
<div class="table">         
               <table>
                  <thead>                                      
                     <tr>
                        <th scope="col">Posizione</th>
                        <th scope="col">Giocatore </th> 
                        <th scope="col">Punteggio</th>
                        <th scope="col">Fascia</th>                        
                     </tr>                  
                  </thead>

                  <asp:repeater id="Repeater1" OnItemDataBound="R1_ItemDataBound" runat="server">
                     <itemtemplate>

                         <asp:Panel ID="Contenitore" runat="server">                               
                               <tr>
                                  <td> <%# Container.DataItem("Posizione") %> </td>
                                  <td> <%# Container.DataItem("Giocatore") %> </td>
                                  <td> <%# Container.DataItem("Punti") %> </td>
                                  <td> <%# Container.DataItem("Fascia") %> </td>
                               </tr>
                         </asp:Panel>
                    </itemtemplate>
                 </asp:repeater>

               </table>


Sub R1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
        '
        'Agisco solo se Item o AlternatingItem e non su righe di header o footer
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            'Qui va la tua condizione
            If e.Item.DataItem("Fascia") = "1" Then
                'Qui colori
                CType(e.Item.FindControl("Contenitore"), Panel).BackColor = Drawing.Color.Red
            End If
        End If

    End Sub


Ma la riga non viene colorata
Modificato da f.amedeo il 03 marzo 2019 11:21 -
11.511 messaggi dal 09 febbraio 2002
Contributi
Ah, ok, stai costruendo una table HTML.
Allora vai così, con l'id="Contenitore" direttamente sulla tr, a cui aggiungi l'attributo runat="server"
                  <asp:repeater id="Repeater1" OnItemDataBound="R1_ItemDataBound" runat="server">
                     <itemtemplate>                       
                               <tr id="Contenitore" runat="server">
                                  <td> <%# Container.DataItem("Posizione") %> </td>
                                  <td> <%# Container.DataItem("Giocatore") %> </td>
                                  <td> <%# Container.DataItem("Punti") %> </td>
                                  <td> <%# Container.DataItem("Fascia") %> </td>
                               </tr>
                    </itemtemplate>
                 </asp:repeater>


E la Sub diventa
Sub R1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
        '
        'Agisco solo se Item o AlternatingItem e non su righe di header o footer
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            'Qui va la tua condizione
            If e.Item.DataItem("Fascia") = "1" Then
                'Qui colori
                CType(e.Item.FindControl("Contenitore"), HtmlControl).Style("background-color") = "#ff0000"
            End If
        End If

    End Sub


Adesso dovrebbe andare. Se ancora non te lo colora, vuol dire che l'If in cui verifichi il valore di "Fascia" non è mai verificato. Metti un breakpoint in corrispondenza di quella riga e cerca di capire cosa contiene il campo "Fascia".

ciao,
Moreno

Enjoy learning and just keep making
126 messaggi dal 05 agosto 2013
Ottimo. Colora tutte le righe in base al controllo impostato.
Grazie ancora per la tua disponibilità, pazienza e soprattutto competenza.
Ciao.
P.S. Credo che ti stolkerizzerò ancora :-)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.