webForumDet fria alternativet

Repeater och dess items...

.NETur .NET

18 svar · 353 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

Jag vill använde en repeater, men tycker att det känns "fel" att lägga logik för vilket fält som ska visas i presentations-skiktet.

Jag undrar därför om det finns något sätt att via koden styra vilket "fält" som ska visas var i "repeatern"?

Från presentationen vill jag bara styra layout, medan jag från "koden" vill styra vilka fält som ska visas var.

Medlem sedan mars 20002 836 inlägg
#2

Jepp, det går ..... men, beror på hur du kodat din "logik"

Om du har en OOP-approach så går det utmärkt:

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="Microsoft.Data.Odbc" %>
<script runat="server">

    ' Insert page code here
    '
    Public Sub Page_Init(sender As Object, e As EventArgs)
        
        Dim _start As New myStart()
        
        Dim n As Integer
        
        Dim repeaterList As New ArrayList()
        
        For n = 0 TO (_start.DetailList.Count - 1)
            '## -- lägg till nytt myDetail object --
            repeaterList.Add(CType(_start.DetailList(n), myDetails))
        Next n
        
        Repeater1.DataSource = repeaterList
        Repeater1.DataBind()
        
    End Sub
    
    
    
    
    
    Public Class myDetails
        
        Public DetailID As Integer
        Public DetailName As String
        
    End Class
    
    Public Class myStart
    
        Public DetailList As New ArrayList()
        
        Public Sub New()
        
            Dim myConnection As New OdbcConnection(ConfigurationSettings.AppSettings("connectionstring"))
            Dim myCommand As New OdbcCommand("SELECT myIdField, myNameField FROM myTable", myConnection)
            
            Dim dr As OdbcDataReader
            
            myConnection.Open()
            
            dr = myCommand.ExecuteReader()
            
            While dr.Read()
            
                Dim _details As New myDetails()
                
                _details.DetailID = CInt(dr("myIdField"))
                _details.DetailName = CStr(dr("myNameField"))
                
                Me.DetailList.Add(_details)
                
            End While
            
        End Sub
        
    End Class

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Repeater id="Repeater1" runat="server" EnableViewState="False">
            <ItemTemplate>
                <a href='file.aspx?id=<%# Ctype(Container.DataItem, myDetails).DetailID %>'><%# Ctype(Container.DataItem, myDetails).DetailName %></a></br>
            </ItemTemplate>
        </asp:Repeater>
    </form>
</body>
</html>

Nu har du bara "teorin"/kod som du får kika igenom......men, det hela bygger på att du populerar en arraylist med ett class-object i varje index och sedan loopar ut ArrayListan i repetearn och använder sig av class-objectet (i detta fall classen myDetails) och dess egenskaper

[redigerat]
Du får ju lov att ändra så att sql-frågan och de olika objecten stämmer, om du kör SQL Server så får du använda SqlConnection osv. Använder själv mySQL därav odbc-managern

På detta sätt kan du ändra fält-namn.
Det man alldrig får ändra är Publica properties och methods, för då kommer ju allt att gå åt h*****e :e
[/redigerat]

cya,
PatrikB

Medlem sedan dec. 19991 072 inlägg
#3

Tack för svaret.

Jodå, jag logiken är uppbyggd på det sättet, med (lilla) skillnaden att jag använder en "structure" ist. för en klass för den "rena" datan.

Men, jag måste ju fortfarande använda följande kod i presentationen:

<ItemTemplate>
<a href='file.aspx?id=<%# Ctype(Container.DataItem, myDetails).DetailID %>'><%# Ctype(Container.DataItem, myDetails).DetailName %></a></br>
</ItemTemplate>

Går det att kod-mässigt skapa den?

Tack på förhand!

Medlem sedan juni 20011 732 inlägg
#4

Om du lägger dina data i ett dataset (eller en datatable) så kan du enkelt lägga till en kolumn i denna och modifiera den så som du vill ha den. Exempelvis:

ds.Tables["myTable"].Columns.Add(new DataColumn("newColumn", typeof(System.String)));
for (int i=0; i<ds.Tables["myTable"].Rows.Count; i++) {
  //Logik för varje rad här, exempelvis:
  ds.Tables["myTable"].Rows[i]["newColumn"] = "blah blah";
}

Sedan tycker jag att det är mycket bättre att du i ditt exempel använder en linkbutton istället för att skriva ren html <a href=...> om du ska programmera en sådan dynamiskt.

Medlem sedan dec. 19991 072 inlägg
#5

Ok, får kolla vidare på det! Tack.

Sedan tycker jag att det är mycket bättre att du i ditt exempel använder en linkbutton istället för att skriva ren html <a href=...> om du ska programmera en sådan dynamiskt.

Håller med, klippte bara ut PatrikB.s exempel.

Medlem sedan mars 20002 836 inlägg
#6

Men, jag måste ju fortfarande använda följande kod i presentationen:

Varför skulle du inte vilja ha den koden i presentationen för?

cya,
PatrikB

Medlem sedan mars 20002 836 inlägg
#7

jo, håller oxå med om det ...... nu vart det bara så att jag "hårdkodade" in en html-tag ...... :e

cya,
PatrikB

Medlem sedan juni 20011 732 inlägg
#8

jo, håller oxå med om det ...... nu vart det bara så att jag "hårdkodade" in en html-tag ...... :e

Ajabaja... ;)

Medlem sedan dec. 19991 072 inlägg
#9

Varför skulle du inte vilja ha den koden i presentationen för?

Kan vara för att jag inte riktigt "förstår" Repeater-kontrollen till fullo...MEN då ALLT annat (typ) i .NET går att styra med objekt och kod, verkar det konstigt att det inte skulle gå med en Repeater.

Jag vill alltså kunna göra det från "code-behind".

Medlem sedan mars 20002 836 inlägg
#10

tyvärr, kan inte hjälpa dig med "code-behind" då jag inte tillämpar det eller kodar i VS.NET

cya,
PatrikB

Medlem sedan apr. 20012 266 inlägg
#11

Har inte fått det riktigt klart för mig vad du vill, du vill alltså kunna styra designen på presentationslagret från koden? Jag tycker det är utmärkt att styra vad som ska visas var i från pres.lagret. eftersom om du vill ändra något så slipper du compilera om.

Hoppas jag förstod rätt.

Medlem sedan dec. 19991 072 inlägg
#12

Jag vill kunna styra utseendet (färger, typsnitt m.m.) från presentationen, samt kunna ange vilket fält som ska visas var.

Vad som känns fel är att behöva använda "<%# %>" i presentationen...samt att behöva skriva: "Container.dataItem".

Codebehind, tillhör ju ändå (på sätt och vis) presentationen, då jag som logik använder "Assemblys".

Medlem sedan juni 20011 732 inlägg
#13

Aha, men då kan du nog glömma att använda en Repeater. Hela presentationen ligger ju i den template som loopas för varje rad inkluderat den kod som krävs för att skriva ut dina data.

Unlike DataList, Repeater has no built-in layout or styles. You must explicitly declare all HTML layout, formatting, and style tags within the templates of the control.

Medlem sedan dec. 19991 072 inlägg
#14

Tack! Då var det löst! Vet man bara att begränsningen finns, så behöver man inte fundera så värst mycket mer!

Tack för alla svar!

Medlem sedan apr. 20012 266 inlägg
#15

Men jag ser inget fel att använda Container.DataItem. Vad är det du inte gillar med det?

Medlem sedan dec. 19991 072 inlägg
#16

Felet tycker jag är följande:

Tänk dig att en person jobbar med att utveckla enbart layouten för en sajt. Denna person skapar designen, samt ritar upp HTML-koden. Den enda ASP.NET kod den behöver känna till är i princip koden för olika kontroller, dock inte hur man använder dem. Typ hur man lägger upp en textbox och sätter dess ID osv.

Detta fungerar bra i alla situationer utom när det gäller en repeater. För då måste denna person plötsligt veta att den ska skriva "Container.DataItem" och så ett fält (som denna designer kanske inte har en aning om).

Nu så är inte fallet så med mig själv, då jag skriver både codebehind koden och gör själva "html"-layouten.

Men...scenariot skulle ju kunna finnas och därav mina funderingar...! :)

Medlem sedan mars 20002 836 inlägg
#17

Men, å andra sidan så behöver ju programmeraren helt plötsligt veta hur designen ska vara, om datalisten ska populeras horisontellt eller vertikalt m.m, m.m

Då e det ett klart bättre läge att "lära" designern (oftast inte den som gör HTML-koden) hur en repeater, eller datalist/grid funkar

cya,
PatrikB

Medlem sedan juni 20011 732 inlägg
#18

Ja, så mycket samarbete mellan designers och programmerare måste ni nog ändå ha att ni kan överbrygga det problemet. :) Alternativt att du som programmerare slänger ut en enkel repeater med de data som ska ut och sedan låter designfolk göra det riktiga layoutjobbet... jag menar, du måste ju ändå i egenskap av programmerare testa att din webbapplikation fungerar med något enkelt webbgränssnitt.

Jag gissar att framtidens designers måste veta en del om programmering, åtminstone asp.net-lagret i detta fall.

Medlem sedan dec. 19991 072 inlägg
#19

Japp, visst är det så...som sagt så jobbar inte vi på det sättet själva...jag bara reagerade på det för att det skulle kunna bli ett problem...

...man måste ifrågasätta allt :)

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)