Ett smidigt sätt (dynamiskt som f-n men kanske inte jättesnabbt) är att du gör en pagelet som tar in en inparameter (grupp i detta fall). Denna pagelet lägger du sedan i en datalist som loopar ut en pagelet för varje grupp... Gjorde nåt liknande för ett tag sedan (ett dynamiskt antal nyhetsgrupper), funkade klockrent!
Javisst! :) Här är principerna för mitt resonemang. Först skapar du en pagelet (en ascx-fil). I din pagelet lägger du exempelvis en datagrid som skriver ut en grupp. Vilken grupp den ska skriva ut sätter du i koden.
Nu vill du ju på något sätt kunna skicka in vilken grupp din pagelet (som ju äår en klass) ska kunna skrivas ut. Detta gör du förslagsvis med accessors "get/set" (du kan ju ha en publik variabel rakt in i klassen men att ge direkt åtkomst till klassens data står i strid med det objektorienterade "reglerna" av många olika skäl).
I koden för din pagelet skriver du:
private string group = "";
public string Group{
set {
group=value;
}
}
Nu har du en privat sträng som du sätta (vi behöver ju inte hämta den så get behöver inte användas). Den privata strängen group använder du sedan exempelvis i din sql-sats för att hämta den grupp som ska listas i din datagrid som du har gjort i din pagelet precis som vanligt.
Nästa steg är att skapa en sida som ska innehålla den här pageleten, en vanlig aspx-sida alltså. I denna skapar du en repeater, datalist etc. Datasource till din repeater är alla de grupper du vill skriva ut. Börja med att få din repeater att fungera:
I din repeater kan du naturligtvis skicka in annat som också är gruppspecifikt och bara ska finnas med en gång per grupp. Men det du vill ha in nu är alla de grupper som ska skickas in i din pagelet. Det gör du helt enkelt genom att slänga in din pagelet i din repeater tillsammans med den publika stäng som vi sätter till gruppnamnet som ju loopas fram dynamiskt för varje rad. Det är inte alls svårt att göra detta:
Här skickare du helt enkelt in Group i din pagelet som sätter den privata variabeln group som du sedan använder i din sql-sats. För varje grupp kommer du alltså att anropa din pagelet som kastar tillbaka en datagrid med den aktuella gruppen!
Jag har börjat lite nu men vete inte hur jag ska fortsätta.
<%@ Control Language="vb" %>
<script runat="server">
dim objconn as new oledbconnection(ConfigurationSettings.AppSettings("connectionstring"))
sub page_load(obj as object, e as eventargs)
'Hämta gruppnamnen och grupp id
dim cup_id as integer = request.querystring("cup_id")
dim objcmd1 as new oledbcommand _
("select namn, id from grupper where cup_id="+ cupid +"", objconn)
dim dr as OleDbdatareader
objconn.open
dr =objcmd1.executereader
if dr.read then
'hämta tabellen
dim objcmd as new oledbdataadapter _
("select deltagande_lag.namn, tabeller.* from tabeller inner join deltagande_lag on tabeller.lag_id = deltagande_lag.id where tabeller.grupp_id = " & grupp_id &" order by tabeller.poang desc,tabeller.plusminus desc,tabeller.plus desc,tabeller.win desc,tabeller.lost asc", objconn)
dim ds as dataset =new dataset()
objcmd.fill(ds, "tabeller")
datagrid1.datasource =ds.tables("tabeller"). _
defaultview
databind()
end if
dim cupid as integer = 35
private grupp as string = ""
public property grupp as string
Set
grupp.Text = Value
end Set
end property
end sub
</script>
<asp:datagrid id="datagrid1" runat="server"
borderwidth="0" itemstyle-backcolor="#ffffff"
alternatingitemstyle-backcolor="#cccccc"
showfooter="False" showheader="True"
autogeneratecolumns="False">
<columns>
<asp:templatecolumn>
<headertemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px">Lag</asp:tablecell>
<asp:tablecell width="15px">Matcher</asp:tablecell>
<asp:tablecell width="15px">V</asp:tablecell>
<asp:tablecell width="15px">O</asp:tablecell>
<asp:tablecell width="15px">F</asp:tablecell>
<asp:tablecell width="25px">+</asp:tablecell>
<asp:tablecell width="25px">-</asp:tablecell>
<asp:tablecell width="30px">+/-</asp:tablecell>
<asp:tablecell width="35px">P</asp:tablecell>
</asp:tablerow>
</asp:table>
</headertemplate>
<itemtemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px"><%# container.dataitem("namn") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("matcher") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("win") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("tie") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("lost") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("plus") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("minus") %></asp:tablecell>
<asp:tablecell width="30px"><%# container.dataitem("plusminus") %></asp:tablecell>
<asp:tablecell width="35px"><%# container.dataitem("poang") %></asp:tablecell>
</asp:tablerow>
</asp:table>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
Hm, vb är ju inte case-sensitive förstås (alltså att den inte gör skillnad på stora och små bokstäver). Observera att din privata variabel som ska sätta gruppen inte får ha samma namn som den publika, det är två olika. Så när jag skrev med stor och liten bokstav så måste du skriva två olika variabelnamn:
private string [b]Group[/b] = "";
public string [b]_Group[/b]{
set {
[b]Group[/b]=value;
}
}
Har lite brottom just nu, men vad jag kan se annars så ser jag inga konstigheter (ska kolla mer noga senare). Du kan ju enkelt prova att den fungerar genom att sätta Group manuellt i koden och klistra oin den på en enkel aspx-sida. Sedan bygger du som sagt en datalist som jag skrev ovan där du inkluderar din pagelet!
Redigerat:
En sak till bara... det är lite onödigt att lägga in en massa egna tabeller i din datagrid så som du har gjort. Det är inte svårt att göra exakt samma tabellstruktur direkt i din datagrid utan templates så blir det betydligt mindre och lättare kod.
Jag menar alltså bara att du manuellt ger variabeln ett värde för att kunna testköra din pagelet, den ska ju vara helt fristående din huvudsida. :) Sen använder du grupp för att plocka ut rätt grupp i din sql-sats.
<script runat="server">
dim objconn as new oledbconnection(ConfigurationSettings.AppSettings("connectionstring"))
sub page_load(obj as object, e as eventargs)
'Hämta gruppnamnen och grupp id
dim cup_id as integer = request.querystring("cup_id")
dim objcmd1 as new oledbcommand _
("select namn, id from grupper where cup_id="+ cup_id +"", objconn)
dim dr as OleDbdatareader
objconn.open
dr =objcmd1.executereader
if dr.read then
'hämta tabellen
dim grupp_id as integer = dr("id")
dim objcmd as new oledbdataadapter _
("select deltagande_lag.namn, tabeller.* from tabeller inner join deltagande_lag on tabeller.lag_id = deltagande_lag.id where tabeller.grupp_id = " & grupp_id &" order by tabeller.poang desc,tabeller.plusminus desc,tabeller.plus desc,tabeller.win desc,tabeller.lost asc", objconn)
dim ds as dataset =new dataset()
objcmd.fill(ds, "tabeller")
datagrid1.datasource =ds.tables("tabeller"). _
defaultview
databind()
end if
end sub
private group as string = "Testgrupp"
public property _group as string
get
group=group
end get
Set
group = Value
end Set
end property
</script>
<asp:datagrid id="datagrid1" runat="server"
borderwidth="0" itemstyle-backcolor="#ffffff"
alternatingitemstyle-backcolor="#cccccc"
showfooter="False" showheader="True"
autogeneratecolumns="False">
<columns>
<asp:templatecolumn>
<headertemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px">Lag</asp:tablecell>
<asp:tablecell width="15px">Matcher</asp:tablecell>
<asp:tablecell width="15px">V</asp:tablecell>
<asp:tablecell width="15px">O</asp:tablecell>
<asp:tablecell width="15px">F</asp:tablecell>
<asp:tablecell width="25px">+</asp:tablecell>
<asp:tablecell width="25px">-</asp:tablecell>
<asp:tablecell width="30px">+/-</asp:tablecell>
<asp:tablecell width="35px">P</asp:tablecell>
</asp:tablerow>
</asp:table>
</headertemplate>
<itemtemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px"><%# container.dataitem("namn") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("matcher") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("win") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("tie") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("lost") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("plus") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("minus") %></asp:tablecell>
<asp:tablecell width="30px"><%# container.dataitem("plusminus") %></asp:tablecell>
<asp:tablecell width="35px"><%# container.dataitem("poang") %></asp:tablecell>
</asp:tablerow>
</asp:table>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
Sen la jag in det här på en aspx sida. Behöver man göra något mer på aspx sidan?
Ska jag köra sql-satsen i pageleten eller i aspx sidan?
I din pagelet. Den ska vara oberoende av kod från sin huvudsida. Och du måste deklarera group ovanför pageload i ditt fall, den måste ju vara deklarerad innan du kan använda den. Sedan använder du variabeln i din sql-sats för att få ut en SPECIFIK grupp (exakt hur beror ju på vad du vill få ut och hur din db ser ut).
Alltså, gör din pagelet precis som om du hade en vanlig aspx-sida för att plocka ut EN grupp ur din db och presentera den i en datagrid. När du har gjort det så kan vi gå vidare sen. :)
<script runat="server">
dim objconn as new oledbconnection(ConfigurationSettings.AppSettings("connectionstring"))
private group as string = "Grupp1"
public property _group as string
get
group=group
end get
Set
group = Value
end Set
end property
sub page_load(obj as object, e as eventargs)
'Hämta gruppnamnen och grupp id
dim cup_id as integer = "35"
dim objcmd1 as new oledbcommand _
("select namn, id from grupper where cup_id="+ cup_id +" and namn='" + group +"'", objconn)
dim dr as OleDbdatareader
objconn.open
dr =objcmd1.executereader
if dr.read then
'hämta tabellen
dim grupp_id as integer = dr("id")
dim objcmd as new oledbdataadapter _
("select deltagande_lag.namn, tabeller.* from tabeller inner join deltagande_lag on tabeller.lag_id = deltagande_lag.id where tabeller.grupp_id = " & grupp_id &" order by tabeller.poang desc,tabeller.plusminus desc,tabeller.plus desc,tabeller.win desc,tabeller.lost asc", objconn)
dim ds as dataset =new dataset()
objcmd.fill(ds, "tabeller")
datagrid1.datasource =ds.tables("tabeller"). _
defaultview
databind()
end if
end sub
</script>
<asp:datagrid id="datagrid1" runat="server"
borderwidth="0" itemstyle-backcolor="#ffffff"
alternatingitemstyle-backcolor="#cccccc"
showfooter="False" showheader="True"
autogeneratecolumns="False">
<columns>
<asp:templatecolumn>
<headertemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px">Lag</asp:tablecell>
<asp:tablecell width="15px">Matcher</asp:tablecell>
<asp:tablecell width="15px">V</asp:tablecell>
<asp:tablecell width="15px">O</asp:tablecell>
<asp:tablecell width="15px">F</asp:tablecell>
<asp:tablecell width="25px">+</asp:tablecell>
<asp:tablecell width="25px">-</asp:tablecell>
<asp:tablecell width="30px">+/-</asp:tablecell>
<asp:tablecell width="35px">P</asp:tablecell>
</asp:tablerow>
</asp:table>
</headertemplate>
<itemtemplate>
<asp:table cellpadding="0" cellspacing="0" borderwidth="0" runat="server">
<asp:tablerow>
<asp:tablecell width="100px"><%# container.dataitem("namn") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("matcher") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("win") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("tie") %></asp:tablecell>
<asp:tablecell width="15px"><%# container.dataitem("lost") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("plus") %></asp:tablecell>
<asp:tablecell width="25px"><%# container.dataitem("minus") %></asp:tablecell>
<asp:tablecell width="30px"><%# container.dataitem("plusminus") %></asp:tablecell>
<asp:tablecell width="35px"><%# container.dataitem("poang") %></asp:tablecell>
</asp:tablerow>
</asp:table>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
Ok! Om den fungerar nu så gör du helt enkelt en datalist i din aspx-sida där du klistrar in din pagelet i dess template och sätter grupp som inparameter. Du fyller din datalist med de olika grupperna (select distinct group).
sub page_load(obj as object, e as eventargs)
dim cup_id as integer = "35"
Dim strSQL as String= String.Format("select namn, id from grupper where cup_id={0}", cup_id)
dim objcmd as new oledbdataadapter(strsql, objconn)
dim ds as dataset =new dataset()
objcmd.fill(ds, "grupper")
datalist.datasource =ds.tables("grupper"). _
defaultview
databind()
end sub