[asp.net] Custom class binden aan een templated control

Pagina: 1
Acties:

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Topicstarter
[insert obligatory "ja ik heb gezocht etc."] :P

Ik ben momenteel bezig met een site voor een klant, en aangezien er weinig haast bij is heb ik de kans aangegrepen om eens wat te experimenteren. De site van de klant bevat o.a. een pagina om nieuwsitems weer te geven, en aangezien ik deze keer mijn hele DAL wou vangen in custom classes, wilde ik die ook door laten vloeien naar de nieuwspagina om zo dmv. een Repeater een lijst met de laatste nieuwsitems te laten zien (met samenvatting ipv volledige body), of (afhankelijk van de result set) de volledige inhoud van een enkel nieuwsbericht.

Hiervoor heb ik een class TvrNieuwsBericht:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Public Class TvrNieuwsBericht
    
        Public _Id As Integer
        Public _Titel As String
        Public _Datum As Date
        Public _Samenvatting As String
        Public _Inhoud As String
        
        Public Readonly Property Id As Integer
            Get
                Return _Id
            End Get
        End Property
        
        Public Readonly Property Titel As String
            Get
                Return _Titel
            End Get
        End Property
        
        Public Readonly Property Datum As Date
            Get
                Return _Datum
            End Get
        End Property
        
        Public Readonly Property Samenvatting As String
            Get
                Return _Samenvatting
            End Get
        End Property
        
        Public Readonly Property Inhoud As String
            Get
                Return _Inhoud
            End Get
        End Property
            
    End Class


en een class TvrNieuwsArchief die een arraylist inherit
Visual Basic .NET:
1
2
3
4
5
6
7
    Public Class TvrNieuwsArchief
        Inherits ArrayList
    
        Public Sub New()                    
        End Sub
    
    End Class

(hij lijkt zo een beetje nutteloos, maar het is de bedoeling dat hier nog meer functionaliteit bijkomt).

Mijn class TvrNieuwsDb haalt aan de hand van een parameter danwel een lijst van nieuwsberichten, danwel een enkel nieuwsbericht op, en returned een TvrNieuwsArchief met TvrNieuwsBericht -en erin.
Het lukt perfect om TvrNieuwsArchief te binden aan een Datagrid (met autogeneratecolumns aan) maar bij een Repeater geeft ie een error.

In de class browser van de ASP.Net Web Matrix zag ik dat elke webcontrol die ITemplate implementeert, de Databind method afkomstig van System.Web.Control override't (hoe zeg je dat in goed Nederlands? :P), maar ik word verder nergens wijzer wat dat betekent voor mijn DAL classes. Google searches leveren artikelen op die enkel vermelden dat je om te databinden een class moet hebben die IEnumerable inherit (wat TvrNieuwsArchief middels ArrayList doet), maar er wordt nergens gesproken over wat je moet doen als je dit aan een repeater wilt binden.
Op MSDN nog wel een artikel over het ontwerpen van een control die ITemplate implementeert, maar niet hoe je daar een custom class in een arraylist aan kunt binden.

Dus mijn vraag: wat moet ik doen om mijn custom class in de arraylist te binden aan een control die ITemplate implementeert? Bvd. :)

[edit]
Bij het binden aan een repeater krijg ik de volgende exception:
System.MissingMemberException: No default member found for type 'TvrNieuwsBericht'

[ Voor 3% gewijzigd door Not Pingu op 02-08-2004 20:34 ]

Certified smart block developer op de agile darkchain stack. PM voor info.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Hoe ziet de definitie van je Repeater template in je .aspx bestand eruit?
Een repeater zal uit zichzelf nooit content laten zien, je moet altijd speciferen (dmv een template) hoe je het wilt hebben.

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Topicstarter
De repeater:
code:
1
2
3
4
5
6
7
8
9
<asp:Repeater id="rptNieuws" runat="server">

    <ItemTemplate>
    
        <h1><%# Container.DataItem("Titel")%></h1>
    
    </ItemTemplate>

</asp:Repeater>


En hier het databinden (GetNieuwsBerichten is een shared function):
code:
1
2
        rptNieuws.DataSource = TvrNieuwsDb.GetNieuwsBerichten("LaatsteNieuws")
        rptNieuws.DataBind()


Zoals gezegd gaat het goed als ik een datagrid in de plaats van de repeater neerzet.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Moet die code op lijn 5 er niet zo uit zien:

code:
1
<h1><% #DataBinder.Eval (Container.DataItem, "Titel")%></h1>

oid?

https://fgheysels.github.io/


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Topicstarter
whoami schreef op 02 augustus 2004 @ 20:48:
Moet die code op lijn 5 er niet zo uit zien:

code:
1
<h1><% #DataBinder.Eval (Container.DataItem, "Titel")%></h1>

oid?
Verrek... ik dacht altijd dat het niet verplicht was om dat zo te schrijven. Normaal doe ik het altijd met Container.DataItem(key) en dat werkt(e) altijd perfect. Maar met Databinder.Eval werkt het idd. Thanks for the heads up :)

Certified smart block developer op de agile darkchain stack. PM voor info.


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
In dit geval kan het ook zo:
code:
1
<%# CType(Container.DataItem, TvrNieuwsBericht).Titel %>


En als je een typed arraylist (of collection) ebruikt kan het ook zo:
code:
1
<%# Container.DataItem.Titel %>

| Toen / Nu

Pagina: 1