webForumDet fria alternativet

Olika presentation i datagrid

9 svar · 230 visningar · startad av cyprys

cyprysMedlem sedan dec. 20003 563 inlägg
#1

Jag vill placera min text i en datagrid eller datalist eller repeater.
Alla med template för att modifiera varje presentation väldigt mycket. Det ska vara en del if-satser och funktioner vid varje presentation. Detta klarar jag men jag skulle vilja ha olika för vilken loopning man är på.
Som jag har nu med en gammal *.asp-metod.

Dim i as integer = 0
Do while Rs.Read()
select case i
case 0, 1, 2, 3
' Stora rubriker med ingress och vissa if-satser för presentation.
case 4, 5, 6, 7, 8, 9, 10
' Endast rubriker
case else
' Ytterligare alternativ visning av nyheter.
end select
x = x -- 1
end loop

Visst det funkar men jag vill använda ASP.NET:s nya funktioner.
Om jag vill skapa ett dataSet och skriva ut med t.ex. datagrid. Hur väljer jag vilken slags presentation jag vill ha?
Hur hålla reda på vilken loop man är inne på alltså?
Jag vill bara ha en sql-fråga då det ska räcka.

NETworkMedlem sedan juni 20011 732 inlägg
#2

Det är alltså labels och textboxar och sånt som du vill påverka INNE i din datalist/repeater, eller ska du påverka själva datalisten (en repeater har inga attribut)? En bra början är väl att loopa igenom ditt dataset/datatable:

for(int i=0;i<ds.Tables["mintabell"].Rows.Count;i++) {
//kod...
}

Sen kan du ju ha iofsatser och annat i din loop som påverkar det utskrivna datat på olika sätt. Vill du ha tag på kontroller kör du en findcontrol på din datalist. Här ett litet exempel hur man kan göra... sedan går det naturligtvis att bygga på hur mycket som helst!

for()... {
  if (ds.Tables["mintabell"].Rows[i]["bollColumn"]) {
    ((TextBox)myDataList.Items[i].FindControl("myTextBox")).visible = true;
  }
}

Vet inte om det var svar på din fråga?

cyprysMedlem sedan dec. 20003 563 inlägg
#3

Nja. Jag har ju ett system som gör att det ser ut precis som jag vill ha det. Dock skulle jag vilja göra det i en datagrid.
Ungefär:

<script runat=server>
// connections m.m här samt skapa ett dataset() i page_load()

function funktioner()
// kolla vilken loop man är inne på och eventuellt sätta visible = false på vissa labels samt bestämma olika stilar m.m
// Det som inte riktigt klaffar är hur man hittar vilken loop man är inne på.
end function
</script>

<asp:datagrid>
<columns>
	<asp:templatecolumn>
	<itemtemplate>
		<asp:label id=rubrik text='<%# funktioner(container.dataitem("rubrik"))%>' runat=server />
		<asp:label id=ingresstext='<%# funktioner(container.dataitem("ingress"))%>' runat=server />	
	</itemtemplate>
	</asp:templatecolumn>
</asp:datagrid>

Ungefär såhär.

NETworkMedlem sedan juni 20011 732 inlägg
#4

Du måste ha något att trigga händelserna med, exempelvis om du har en kolumn i ditt dataset som avgör vilket case du ska köra eller om du har en viss text som triggar en viss händelse.

Det som inte riktigt klaffar är hur man hittar vilken loop man är inne på.

I mitt exempel ovan är det variabeln "i" som är ditt index. Om du exempelvis vill göra något på varannan rad så kan du ju kolla om i är ett jämnt tal eller ett udda.

cyprysMedlem sedan dec. 20003 563 inlägg
#5

Ok. Så in funktionen kan jag alltså skriva:
select case ds.tables("nyhet").rows
case 1, 2, 3
label2.visible = false
end select
eller nått liknande?

Jag vill alltså inte starta någon loop, utan datagriden jobbar väl för sig själv utan att jag ska behöva skriva in någon for i = 0 to 3.

cyprysMedlem sedan dec. 20003 563 inlägg
#6

För att underlätta kan jag skicka koden jag gjorde temporärt.
Den går i gammal *.asp-anda och inget jag vill fortsätta använda. Allt jag frågar om är i utbildningssyfte :) .

<%
Dim sportID as string = request.querystring("sportID")

Dim sqlcmd as string
sqlcmd = "SELECT rubrik, datum, ingress, nyhet, sport, ovrinfo FROM nyheter "
if NOT sportID = "-1" AND NOT sportID = "" then
	sqlcmd += "WHERE sport = "+sportID+""
end if
sqlcmd += " ORDER BY datum DESC"

Dim conn As new OledbConnection(Application("connstring"))
Dim cmd as oleDbCommand = new OleDbCommand(sqlcmd, conn)
Dim rs as oleDbDataReader
Dim x as integer
conn.open()
	rs = cmd.executeReader()
	x = 0
	do until NOT rs.read()
		select case x
			case 0, 1, 2
				response.write("<div class=datum1>" & datum(Rs("datum")) & consport(Rs("sport"), Rs("ovrinfo")) & "</div>")
				response.write("<div class=rubrik1>" & Rs("rubrik") & "</div>")
				response.write(show(Rs("ingress")) & "<br><br>")
		end select
	x = x -- 1
	loop
conn.close()
%>
NETworkMedlem sedan juni 20011 732 inlägg
#7

Vänta, nu vet jag vad du ska prova! Både datagrid/datalist/repeater har har något som heter ItemDataBound, det är ett event som körs för varje item när du bundit dess data. Det perfekta stället att lägga case och ifsatser för att forma både layout och innehåll.

void myItemDataBoundHandler (Object src, DataGridItemEventArgs e) { 
//Kod, exxempelvis...
((TextBox)e.Item.FindControl("myTextBox")).visible = true;
}
cyprysMedlem sedan dec. 20003 563 inlägg
#8

Hmm. Ok. :q
Du har inte lust att hjälpa vart jag ska börja? ;)

NETworkMedlem sedan juni 20011 732 inlägg
#9

Använder du visual studio.net? Då är det riktigt enkelt att köra igång... välj din datagrid (eller vilken kontroll du nu har), i propertiesfönstret klickar du på event. Där finns itemdatabound. Skriv funktionens namn och tryck enter så hoppar du in i en färdig funktion för dess event, exempelvis som funktionen jag skrev ovan (void myItemDataBoundHandler (Object src, DataGridItemEventArgs e).

Här kan du nu börja labba med ditt DataGridItemEventArgs som ju körs för varje rad i din datagrid! Lite exempel:

//plocka ut ditt index:
e.Item.ItemIndex
//Fånga upp en textboxkontroll och sätta texten:
((TextBox)e.Item.FindControl("myTextBox)).Text = "hejhej";
//Sätta bakgrundsfärgen i en specifik cell:
e.Item.Cells[2].BackColor = Color.Blue;

Observera att detta körs för varje rad i din datagrid. Mer läsning om ItemDataBound finns i dokumentationen... eller om du söker på ItemDataBound och asp.net i google så får du många bra sidor att titta på! Har du fler problem så får du fråga igen. :)

cyprysMedlem sedan dec. 20003 563 inlägg
#10

Ok. Jag använder tyvärr inte VS.NET.
Börjar arbeta lite med det på en gång :)
Tackar för hjälpen.. Jag återkommer ska du se. ;)

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