Hur fungerar onItemDataBound()?
om jag kör en ny sql-fråga i den. Kan jag då få in värden från den frågan i samma datagrid eller måste jag skapa en ny datalist/repeater som jag skriver ut värden i?
23 svar · 678 visningar · startad av andreas_lindh · sida 2 av 2
jag försöker plussa ihop värden ifrån en databas I fältet malmin sparas tex 2+5+20 jag har en funktion som inte fungerar. Någon som vet hur jag kan lösa det här eller något bätre sätt att göra det på Dim strSQL As String = String.Format("select mf.malmin from matchfakta mf,smatcher s where mf.mID = s.ID and s.SerieID={0} and mf.SpelarID={1} and mf.vilken ='penalty'", serie, spelare)
Läs frågan i sin helhet →Hur fungerar onItemDataBound()?
om jag kör en ny sql-fråga i den. Kan jag då få in värden från den frågan i samma datagrid eller måste jag skapa en ny datalist/repeater som jag skriver ut värden i?
onItemDataBound() fungerar så att den körs vid varje gång som du binder ett värde till din datagrid, samt för header och footer.
Det betyder att för varje rad som skall skrivas ut i din datagrid så körs funktionen onItemDataBound() och i den funktionen så kör du en ny databasfråga och hämtar svaret, bygga ihop din sträng, och sedan binda strängen till en label i datagriden. Det är rätt enkelt när man lärt sig, men kan vara lite kluddigt i början.
Du kan läsa mer om ItemDataBound() här: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolsdatagridclassitemdataboundtopic.asp
- M
jag har gjorts å här men det fungerar inte
Sub Item_Bound(ByVal sender As Object, ByVal e As DataGridItemEventArgs)
Dim spelare As Integer = CInt(CType(e.Item.FindControl("lblSpelare"), Label).Text)
Dim serieID As Integer = CInt(CType(e.Item.FindControl("lblSerieID"), Label).Text)
'hämta från databasen
end sub
Jag får felet
Object reference not set to an instance of an object.
Finns det något annat sätt att få tag på värdena?
Försökte även med
Dim spelare as integer = e.Item.ItemIndex
men då får jag bara ut -1
jag har satt Datakeyfield="spelarID" i datgriden
Din kod ser rätt ut (kan dock in VB.NET utan bara C#) men du har missat en sak.
Första gången du kommer in i din Item_Bound funtion så är du i "Headern" och inte i någon "Rad". Alltså så finns inte dina kontroller lblSpelare och lblSerieID. Utan du måste kolla så att du är i en "Rad" och inte i "Header" eller "Footern", detta gör du med (i C#)
if((e.Item.ItemType == ListItemType.Item) ||
(e.Item.ItemType == ListItemType.AlternatingItem))
{
Sedan eftersom dessa två labels inte har något värde så är det ingen mening att hämta information från dem. Du skall däremot sätta deras värde i din Item_Bound så här
(CType(e.Item.FindControl("lblSpelare"), Label).Text = e.Item.Cells[1].Text
(CType(e.Item.FindControl("lblSerieID"), Label).Text = e.Item.Cells[2].Text
Eller hur man nu gör i VB.NET. Du måste dock läsa på bättre om just e.Item för man kan inte göra riktigt så med all data man binder till kontrollen utan det beror på vilken typ som man binder till sin kontroll.
Själv brukar jag göra klasser av alla mina tabeller i databasen, och varje rad blir ett eget object då kan jag kasta om det till mitt objekt och sedan binda det direkt, så här:
.
.
.
CPerson oPerson = (CPerson) e.Item.DataItem;
((Label)e.Item.FindControl("FirstName")).Text = oPerson.FirstName;
((Label)e.Item.FindControl("LastName")).Text = oPerson.LastName;
.
.
.
Otroligt smidigt :)
- m