Repeater - Hodnoty   zodpovězená otázka

ASP.NET WebForms, Komponenty

Dobrý den,

rád bych požádal o pomoc s následujícím (předpokládám, že banálním problémem).

Mám vytvořenou následující komponentu REPEATER, do níž některé hodnoty načítám z databáze, ale položky lbl_SumCena a lbl_SumCenaDPH potřebuji pro jednotlivé řádky vypočítat z načtených hodnot.

  <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1">
  <ItemTemplate>   
  <table>
  <tr>
  <td style="width:70px;"><asp:Label ID="lbl_ObjKod" runat="server" Text='<%# Eval("ObjKod") %>'></asp:Label></td>
  <td style="width:260px; text-align:left;"><asp:Label ID="lbl_Sortiment" runat="server" Text='<%# Eval("Sortiment") %>'></asp:Label></td>
  <td style="width:50px; text-align:right;"><asp:Label ID="lbl_ks" runat="server" Text='<%# Eval("Quantity") %>'></asp:Label></td>
  <td style="width:80px; text-align:right;"><asp:Label ID="lbl_AktCena" runat="server" Text='<%# Eval("UnitPrice","&nbsp;{0:C}&nbsp;") %>'></asp:Label></td>
  <td style="width:80px; text-align:right;"><asp:Label ID="lbl_SumCena" runat="server" Text=""></asp:Label></td>
  <td style="width:50px; text-align:right"><asp:Label ID="lbl_SazbaDPH" runat="server" Text='<%# Eval("DPH") %>'></asp:Label></td>
  <td style="width:80px; text-align:right;"><asp:Label ID="lbl_SumCenaDPH" runat="server" Text=""></asp:Label></td>
  </tr>
  </table>  
  </ItemTemplate>    
  <SeparatorTemplate>
  <table style="width:670px; height:5px;">
  <tr>
  <td>&nbsp;</td>
  </tr>
  </table>
  </SeparatorTemplate>      
  </asp:Repeater>

Děkuji předem za nakopnutí

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud je to jednoduchý výpočet, tak dovnitř expressionu <%# %> můžete dát výraz - prostě ten Eval k něčemu přičtete, přenásobíte ho něčím atd.

Pokud je to složitější, najděte si událost ItemCreated, v níž můžete provést složitější výpočty a manipulovat s komponentami.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Moc děkuji,

jelikož tam těch výpočtů je víc použil jsem tu variantu s tou událostí ItemCreated, ale nedaří se mi správně najít přístup k těm jednotlivým položkám. Zkoušel jsem např. toto

    Protected Sub Repeater1_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
            
        Dim SumCena As Decimal
        SumCena = CDec(CType(Repeater1.FindControl("lbl_ks"), Label).Text * CType(Repeater1.FindControl("lbl_AktCena"), Label).Text)
        CType(Repeater1.FindControl("lbl_SumCena"), Label).Text = Format(SumCena, "C")

        
        Dim DPH As Integer
        If CType(Repeater1.FindControl("lbl_SazbaDPH"), Label).Text.Length = 2 Then
            DPH = CInt(CType(Repeater1.FindControl("lbl_SazbaDPH"), Label).Text.Substring(0, 1))
        End If
        If CType(Repeater1.FindControl("lbl_SazbaDPH"), Label).Text.Length = 3 Then
            DPH = CInt(CType(Repeater1.FindControl("lbl_SazbaDPH"), Label).Text.Substring(0, 2))
        End If
        
        
        Dim SumCenaDPH As Decimal
        SumCenaDPH = SumCena + (SumCena / 100 * DPH)
        CType(Repeater1.FindControl("lbl_SumCenaDPH"), Label).Text = Format(SumCenaDPH, "C")
        
    End Sub

, ale stále mám hlášení, že odkaz není nastaven na instanci objektu ...

Prosím ještě o pomoc

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkontrolujte si, aby pristup ke controlum byl pouze v Item template nebo Alternate Item Template. Zapredpokladu ze pouzivate i HeaderTemplate a FooterTemplate.

if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
 //... nejake zpracovani
}

Take by to slo v udalosti ItemDataBound.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Ano, a komponenty nesmíte hledat v celém Repeateru, protože tam jsou víckrát, ale v e.Item, což je aktuální instance šablony ItemTemplate.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji opět za pomoc, ale stále nejsem u konce.

Podle Vašich námětů jsem nakonec sesmolil toto ...

(Celý výpočet jsem musel dát do události "ItemDataBound", protože v původní "ItemCreated" jsem dostával hlášení, že vstupní řetězec nemá správný formát - zřejmě položky používané ve výpočtu byly při provádění prázdné)

Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
        If e.Item.ItemType <> ListItemType.Item Or e.Item.ItemType <> ListItemType.AlternatingItem Then
            
            Dim SumCena As Decimal
            SumCena = CDec(CType(e.Item.FindControl("lbl_ks"), Label).Text * CType(e.Item.FindControl("lbl_AktCena"), Label).Text)
            CType(e.Item.FindControl("lbl_SumCena"), Label).Text = Format(SumCena, "C")
            
            Dim DPH As Integer
            If CType(e.Item.FindControl("lbl_SazbaDPH"), Label).Text.Length = 2 Then
                DPH = CInt(CType(e.Item.FindControl("lbl_SazbaDPH"), Label).Text.Substring(0, 1))
            End If
            If CType(e.Item.FindControl("lbl_SazbaDPH"), Label).Text.Length = 3 Then
                DPH = CInt(CType(e.Item.FindControl("lbl_SazbaDPH"), Label).Text.Substring(0, 2))
            End If
            
            Dim SumCenaDPH As Decimal
            SumCenaDPH = SumCena + (SumCena / 100 * DPH)
            CType(e.Item.FindControl("lbl_SumCenaDPH"), Label).Text = Format(SumCenaDPH, "C")
            
            Dim AktCena As Decimal
            AktCena = CType(e.Item.FindControl("lbl_AktCena"), Label).Text
            CType(e.Item.FindControl("lbl_AktCena"), Label).Text = Format(AktCena, "C")
            
        End If
    End Sub

a zdálo se, že to již funguje jak má.

Nyní jsem, ale zjistil, že pokud repeater načítá z databáze pouze jednu položku, je vše v pořádku.

Pokud však má repeater zobrazit více položek, hlásí opět, že odkaz není nastaven na instanci objektu ...

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Protoze to delate presne naopak nez jsem psal.

'spatne

If e.Item.ItemType <> ListItemType.Item OrElse e.Item.ItemType <> ListItemType.AlternatingItem Then
' ... kod ...
End If

Misto nerovnosti chcete prece rovnost, protoze chcete projet controls jenom v Item nebo AlternateItem...

'spravne

If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
' ... kod ...
End If

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Tak mockrát dík,

už je to OK ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback