webForumDet fria alternativet

Smartaste sättet att visa listor i kategorier

8 svar · 347 visningar · startad av Pace

PaceMedlem sedan juni 20019 024 inlägg
#1

Jag har en "frågepanel" på min webbsida och visar frågor under olika kategorier. Vilket är det smartaste sättet att visa upp datan i detta formatet:

Kategori #1
  Fråga 1
  Fråga 3
  Fråga 4

Kategori #2
  Fråga 2
  Fråga 5

Kategori #3
  ... osv

När datan hämtas från databasen så hämtas det på detta viset:

[b]kategori | fråga[/b]
Kategori #1, fråga 1
Kategori #1, fråga 3
Kategori #1, fråga 4
Kategori #2, fråga 2
Kategori #2, fråga 5
Kateogir #3, ...
renholmMedlem sedan apr. 20012 266 inlägg
#2

Först en DataGrid eller DataList som hämtar Kategorierna sedan i den datalisten för varje kategori har du en till datalist eller datagrid som frågorna hämtas till.

PaceMedlem sedan juni 20019 024 inlägg
#3

Du har inte något kodexempel liggandes?

renholmMedlem sedan apr. 20012 266 inlägg
#4

Hum, inte just nu... Men det var inte så svårt att fixa har jag för mig. Men ungefär så här ("fri hand"):

<asp:datalist datakeyfield="id" id="dl1">
<itemtemplate>
   Kategori:
</itemtemplate>
<selecteditemtemplate>
   Kategori:<br>
   <asp:datalist datasource='<%# getQ(dl1.DataKeys[dl1.SelectedIndex]) %>'/>
</selecteditemtemplate>
</asp:datalist>

Ungefär sådär....

PaceMedlem sedan juni 20019 024 inlägg
#5

Tack, men det blir ju flera databashämtningar beroende på antalet kategorier?!

Hittade även detta:

Displaying Two DataTables In One DataGrid
http://www.dotnetbips.com/displayarticle.aspx?id=94

renholmMedlem sedan apr. 20012 266 inlägg
#6

Mm, eller först hämtas alla kategorier och sedan när man väljer en kategori så hämtas frågorna som ska vara under kategorin. Så funkar mitt exempel men vet inte om det är det mest optimala, kanske ska försöka hämta allt på engång.

PaceMedlem sedan juni 20019 024 inlägg
#7

Jo, på så vis fungerar det ju perfekt, men när man vill visa kategorierna och dess frågor på en och samma sida så blir det så många databashämtningar som det finns kategorier.

Jag vill endast använda 1 sql-fråga som hämtar alla kategorier samt 1 sql-fråga som hämtar frågorna. Därutöver kan det vara länkar som leder till en sida som endast visar frågorna i en specifik kategori.

PaceMedlem sedan juni 20019 024 inlägg
#8

Kodexemplet i länken jag postade ovan fungerade inte för mig, men jag lyckades i alla fall hitta detta som fungerar som det ska:

Nested DataLists
http://aspnet101.com/aspnet101/aspnet/codesample.aspx?code=nest

Endast två sql-frågor.

PatrikBMedlem sedan mars 20002 836 inlägg
#9

Går ju att lösa med en repeater oxå. Kanske inte det smidigaste, men det funkar.
OBS! använder rak HTML-kod för tabeller .... man bör använda asp:table osv ..... men för visnings syfte räcker detta ;)

<%@ Page Language="VB" Debug="True" %>
<script runat="server">
    Private lastCategory As String = ""
    
    Private Sub Page_Load(sender As Object, e As EventArgs)
        Dim _list as New ArrayList()
    
        Dim N As Integer
        For N = 0 TO 10
            Dim I As Integer
            For I = 0 TO 5
                Dim _myList As New MyList()
                    _myList.Id = N
                    _myList.Category = "Category " & N.ToString()
                    _myList.Name = "Name " & I.ToString() & " in category: " & _myList.Category
                
                _list.Add(_myList)
            Next
        Next
    
        rpList.DataSource = _list
        rpList.DataBind()
    End Sub
    
    Public Function doHide(ByVal cat As String) As Boolean
    
        Dim blnHide As Boolean = False
        
        If (lastCategory <> cat) Then
            blnHide = True
        End If
        
        lastCategory = cat
        Return blnHide
        
    End Function
    
    Public Class MyList
    
        Private m_strCategory as String = ""
        Private m_strName As String = ""

        Public Property Category() As String
            Get
                Return m_strCategory
            End Get
            Set(ByVal Value As String)
                m_strCategory = Value
            End Set
        End Property
    
        Public Property Name() As String
            Get
                Return m_strName
            End Get
            Set(ByVal Value As String)
                m_strName = Value
            End Set
        End Property
    
    End Class

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Repeater id="rpList" runat="server">
        <ItemTemplate>
            <table border="0">
                <tr>
                    <td colspan="2" runat="server" visible="<%# doHide(CType(Container.DataItem, MyList).Category)%>"><b><%# CType(Container.DataItem, MyList).Category %></b></td>
                </tr>
                <tr>
                    <td widht="20" runat="server">&nbsp;&nbsp;</td><td runat="server"><%# CType(Container.DataItem, MyList).Name %></td>
                </tr>
            </table>
        </ItemTemplate>
        </asp:Repeater>
    </form>
</body>
</html>

På detta sätt räcker det med en databas-hämtning :e

cya,
PatrikB

145 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
141 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)