Skapa tabellverk codebehind
Förord
Tidigare i asp är du van vid att bygga strängar av html blandat med programkod. I asp.net finns den färdiga datagridd-kontrollen som är otroligt smidig. Men hur skulle man kunna arbeta med tanken att bygga en datagrid från codebehind och utan att konkatenera html-strängar? Svaret är inte så svårt faktiskt, man använder asp.net table-kontrollen, dvsInnehåll
»»
»
»
»
»
»
Relaterade artiklar
» Förbered ett projekt mot dataklassen» Loopa data från datareader och dataset
» Skapa ett databaslager
» Visa data från sqldatabas via en datagrid
Förord
Nu har vi kommit så långt i artikelserien att vi har lyckats ansluta till en datakälla via en komponent vi byggt. Vi kan välja att hämta ut informationen via datareader eller dataset och som ni kommer ihåg, datareader är det som gäller så ofta det går eftersom den är snabbare och tar mindre internminne från servern.
Hämta data som vanligt
Vi börjar med att hämta informationen från databasen som vanligt. Vi kommer senare begränsa oss till några få fält genom att välja ut dessa i vår sql-sats. Koden är som tidigare:
' VB.Net
Dim dr As SqlClient.SqlDataReader = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers")
While dr.Read
' ...
End While
dr.Close()
// c#
SqlClient.SqlDataReader dr = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers");
while (dr.Read) {...}
while (dr.Read) {
// ....
}
dr.Close();
Dra en serverkontroll table till formuläret
Det vi nu skall göra är att använda oss av en serverkontroll som heter table. Ni ser den till vänster i er toolbox. Dra den till formuläret och sätt dess id till tblCust. Nu har vi en serverkontroll som ser ut som följer i vårt formulär:Om du har ett tabellverk redan skapat, kan du lägga kontrollen i någon av dess celler för att bestämma vart tabellen skall ligga i förhållande till andra delar på din aspx-sida.
Loopa datat
Vi gör också som du sett ovan med koden. Vi loopar datat som vanligt för där är ingen skillnad. Det vi skall göra däremot är något helt annat inuti loopen. Vi skall skapa nya tr och td-taggar för varje rad, fylla dessa med text och sedan lägga in i vår tblCust. Så här går det till.1. För varje rad i loopen, skapa ny tr och td-taggar.
2. Fyll td-taggarna med värden
3. Addera td-taggarna till tr-taggen
4. Addera tr-taggen till tblCust
För att "addera" kontroller till en annan används kommandot Controls.Add(). Vi skall titta närmare på detta nu.
' VB.Net
' vi rensar ut vad som fanns tidigare, exempelvis om viewstate
' håller reda på innehållet och vi vill se förändringarna
tblCust.Rows.Clear
Dim dr As SqlClient.SqlDataReader = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers")
While dr.Read
Dim tr as New TableRow
Dim td1 As New TableCell
Dim td2 As New TableCell
td1.Text = dr(1)
td2.Text = dr(2)
tr.Controls.Add(td1)
tr.Controls.Add(td2)
tblCust.Controls.Add(tr)
End While
dr.Close()
// C#
tblCust.Rows.Clear();
SqlClient.SqlDataReader dr = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers");
while (dr.Read) {
TableRow tr = new TableRow();
TableCell td1 = new TableCell();
TableCell td2 = new TableCell();
td1.Text = dr(1);
td2.Text = dr(2);
tr.Controls.Add(td1);
tr.Controls.Add(td2);
tblCust.Controls.Add(tr);
}
dr.Close();
Ungefär såhär ser det enklaste exemplet ut. Studera det en sekund så du förstår innebörden ordentligt. Får du kläm på detta, ja då kan du göra hur avancerade kontroller själv sen, till och med en egen datagrid för alla dina projekt i framtiden. Tänk så smidigt att bara skicka in en sql-sats.
Om du nu testar detta exempel nu skall du se vad som händer. Datat kommer att komma ut i en tabell. Du kan även sätta properties på tabellen, antingen via IDE:t eller så kan du göra det code-behind.
With tblCust
.Rows.Clear()
.CellPadding = 0
.CellSpacing = 0
.BorderStyle = BorderStyle.Dotted
.BorderWidth = Unit.Pixel(1)
End With
Här använder jag With-kommandot och det gör jag för att slippa skriva ut tblCust på varenda rad. Som du för övrigt ser, kan du gör i stort sett precis vad du vill här. Egenskaperna listas upp genom att bara skriva punkt . och med intellisense så får du alla properties (egenskaper) som objektet tblCust har att använda sig av.
tblCust.Rows.Clear();
tblCust.CellPadding = 0;
tblCust.CellSpacing = 0;
tblCust.BorderStyle = BorderStyle.Dotted;
tblCust.BorderWidth = Unit.Pixel(1);
Ni ser också en ny funktion, Unit.Pixel. Den används för att bestämma värden på många saker, inte bara bredd utan även fontstorlek osv. det funns även exempelvis Unit.Percentage(32) om man vill använda det.
Formatera cellerna lite också
Givetvis kan du göra precis samma sak med tr, td1 och td2 också. Vi kan ta en enkel variant och det är att färga varannan rad röd. Då kan du använda dig av MOD kommandot för att känna av om det är udda eller jämna nummer.
' VB.Net
Private Function BuildTableCodeBehind()
With tblCust
.Rows.Clear()
.CellPadding = 0
.CellSpacing = 0
.BorderStyle = BorderStyle.Dotted
.BorderWidth = Unit.Pixel(1)
End With
Dim dr As SqlClient.SqlDataReader = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers")
Dim rownumber As Integer = 0
While dr.Read
Dim tr As New TableRow
Dim td1 As New TableCell
Dim td2 As New TableCell
td1.Text = dr(1)
td2.Text = dr(2)
rownumber += 1
If rownumber Mod 2 = 0 Then
tr.BackColor = Color.Red
End If
tr.Controls.Add(td1)
tr.Controls.Add(td2)
tblCust.Controls.Add(tr)
End While
dr.Close()
End Function
// C#
Private Function BuildTableCodeBehind()
With tblCust
.Rows.Clear()
.CellPadding = 0
.CellSpacing = 0
.BorderStyle = BorderStyle.Dotted
.BorderWidth = Unit.Pixel(1)
End With
Dim dr As SqlClient.SqlDataReader = DataFunctions.SQLFunctions.ReturnDataReader("select * from customers")
Dim rownumber As Integer = 0
While dr.Read
Dim tr As New TableRow
Dim td1 As New TableCell
Dim td2 As New TableCell
td1.Text = dr(1)
td2.Text = dr(2)
rownumber += 1
If rownumber Mod 2 = 0 Then
tr.BackColor = Color.Red
End If
tr.Controls.Add(td1)
tr.Controls.Add(td2)
tblCust.Controls.Add(tr)
End While
dr.Close()
End Function
0 Kommentarer