webForumDet fria alternativet

Skriva ut tabeller

.NETur .NET

25 svar · 720 visningar · startad av andreas_lindh

Medlem sedan jan. 20011 140 inlägg
Frågan#1

Har en sida där jag ska skriva ut tabeller för hockeycuper.
Antalet grupper kan vara från 1 och uppåt.

Skriva ut en tabell är inga problem.
Då skapar jag bara en datagrid

Jag hämtar antalet tabeller i en databas.

Någon som har en ide om hur jag kan göra när det är flera grupper?

Medlem sedan juni 20019 024 inlägg
Medlem sedan juni 20011 732 inlägg
#3

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!

Medlem sedan jan. 20011 140 inlägg
#4

Skulle du kunna ge lite kodexempel

Medlem sedan juni 20011 732 inlägg
#5

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:

<asp:repeater id="GroupRepeater" runat="server">
  <itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Group")%>
  </itemtemplate>
</asp:repeater>

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:

<asp:repeater id="GroupRepeater" runat="server">
  <itemtemplate>
    <span class="topic"><asp:label id="GroupTopicL" text='<%# DataBinder.Eval(Container.DataItem, "Group")%>' runat="server"></asp:label> </span>
    <hr class="Default">
    <myPL:GroupPL [b]Group='<% DataBinder.Eval(Container.DataItem, "Group")%>'[/b] runat="server">
    </myPL:GroupPL>  
    </br>
    </br>  
  </itemtemplate>
</asp:repeater>

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!

Medlem sedan jan. 20011 140 inlägg
#6

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>

Jag är inte säker på att jag tänkt rätt.

Medlem sedan juni 20011 732 inlägg
#7

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.

Medlem sedan juni 20011 732 inlägg
#8

Ah, nu ser jag ett fel till. :) Flytta ut detta ur din pageload, det ska inte ligga i en sub!

private string Group = "";
public string _Group{
set {
    Group=value;
  }
}
Medlem sedan jan. 20011 140 inlägg
#9

Hur ska jag göra för att ge group ett värde?

Medlem sedan juni 20011 732 inlägg
#10

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.

Medlem sedan jan. 20011 140 inlägg
#11

Ska jag köra sql-satsen i pageleten eller i aspx sidan?

Medlem sedan jan. 20011 140 inlägg
#12

Jag testade att sätta ett värde på group.

<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?

<asp:repeater id="GroupRepeater" runat="server">
				<itemtemplate>
					<%# DataBinder.Eval(Container.DataItem, "Group")%>
				</itemtemplate>
			</asp:repeater>
Medlem sedan juni 20011 732 inlägg
#13

andreas_lindh skrev:

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. :)

Medlem sedan jan. 20011 140 inlägg
#14

så här hade jaggjort för att skriva ut en tabell

<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>
Medlem sedan juni 20011 732 inlägg
#15

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).

<asp:repeater id="GroupRepeater" runat="server">
  <itemtemplate>
    <asp:label id="GroupTopicL" text='<%# DataBinder.Eval(Container.DataItem, "Group")%>' runat="server"></asp:label> 
    <hr>
    <myPL:GroupPL Group='<% DataBinder.Eval(Container.DataItem, "Group")%>' runat="server">
    </myPL:GroupPL>  
    </br>
    </br>  
  </itemtemplate>
</asp:repeater>
Medlem sedan jan. 20011 140 inlägg
#16

Ska jag göra en ny select sats på aspx sidan?

Medlem sedan juni 20011 732 inlägg
#17

Japp, du ska plocka ut alla dina grupper och fylla din datalist med dem.

Medlem sedan jan. 20011 140 inlägg
#18

Nu har jag gjort så här på aspx sidan

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

Sen provade jag att skriva ut grupperna så här

<asp:datalist id="datalist" runat="server">
				<itemtemplate>
					<%# DataBinder.Eval(Container.DataItem, "Namn")%>
				</itemtemplate>
			</asp:datalist>

Men inget skrevs ut

Medlem sedan juni 20011 732 inlägg
#19

Titta fyra inlägg upp för ett kodexempel. Lägg din pagelet i din datalist och skicka in gruppnamnet.

Medlem sedan jan. 20011 140 inlägg
#20

När jag nu skickar in värdet i pageleten.

Hur får jag tag på värdet i pageleten?

147 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)