webForumDet fria alternativet

Plussa ihop värden

.NET

23 svar · 678 visningar · startad av andreas_lindh · sida 2 av 2

Frågan, av andreas_lindh

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 →
Medlem sedan jan. 20011 140 inlägg
#21

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?

Medlem sedan maj 20012 812 inlägg
#22

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

Medlem sedan jan. 20011 140 inlägg
#23

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

Medlem sedan maj 20012 812 inlägg
#24

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

249 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)