Jag gör en enkel beräkning av data jag hämtar ur en databas. Samma (nästan) upprepas 25 gånger. Du kan lägga alla Label kontroller i en array eller list som du sedan går igenom och tilldelar värde. Tja, det är ju inte Samma värde, det är olika poster i databasen som summeras och räknas om till en % andel, Men det är samma procedur för allt. Hej, du kan loopa igenom controls-samlingen om du vill, och därefter sätta värden. Exvis nåt sånt här: Kan du inte ha någon lookup array som mappar värden mot kontrollerHur förenklar jag detta för att slippa sitta och bara dumskriva?
Kan man göra någon typ av array eller nåt av nedan?
Jag har slagit en del i böckerna jag har, men når inte fram.
<code>
'datan hämtas med sql sats SUM(xxx)
Dim reader As OleDbDataReader = Command.ExecuteReader()
reader.Read()
lblSumForm.Text = reader.GetDouble(0)
lblSumElem.Text = reader.GetDouble(1)
'osv...
Protected Sub Button8_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'gör en funktion sedan...
'undvik division med 0 if sumtim=0 then sumtimtext=1?!
lblFormProc.Text = lblSumForm.Text / SumTim.Text * 100 'beräkna % av arbetad tid
If lblFormProc.Text > 40 Or lblFormProc.Text < 4 Then ' färga röd om utanför intervall
lblFormProc.BackColor = Drawing.Color.Red
End If
'***********
lblProcElem.Text = lblSumElem.Text / SumTim.Text * 100 'beräkna % av arbetad tid
If lblProcElem.Text > 40 Or lblProcElem.Text < 4 Then ' färga röd om utanför intervall
lblProcElem.BackColor = Drawing.Color.Red
End If
'************
lblProcDem.Text = lblSumDemont.Text / SumTim.Text * 100 'beräkna % av arbetad tid
If lblProcDem.Text > 40 Or lblProcDem.Text < 4 Then ' färga röd om utanför intervall
lblProcDem.BackColor = Drawing.Color.Red
End If
'************
' osv 25 ggr
End Sub
</code>
Visst måste det väl gå att förenkla fast inte jag lärt mig det? Irriterande att bara sitta och dumskriva. Jag har gjort det tidigare, men det känns fel om det finns bättre lösning.
Jag kan underlätta lite om jag gör något i stil med: lblProc1.text, lblProc2.text, (behöver bara ändra en siffra då) men något smartare kanske finns så det räcker med 5-6 rader istället för över 100? Kan man få en vink i rätt riktning så jag vet vad jag ska försöka lära mig?Sv: Hur förenklar jag detta för att slippa sitta och bara dumskriva?
Men ännu smartare är att räkna ut allting en gång och lagra i en variabel som du sedan använder för att tilldela alla samma värde.
Förstår inte riktigt varför du vill visa samma värde 25 gånger?Sv:Hur förenklar jag detta för att slippa sitta och bara dumskriva?
Hämta värde, lagra timmarna (för just den posten) i en lbl, räkna om dessa timmar till % av totalsumma.
Jag tänkte det var lika nog för att hitta på något smartare...
Jag ska titta om jag får till något med en array av labels.Sv: Hur förenklar jag detta för att slippa sitta och bara dumskriva?
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As Control
Dim strPart1 As String
Dim strPart2 As String
Dim l1 As Label
Dim l2 As Label
Dim nSumTim As Decimal
nSumTim = Convert.ToDecimal(txtSumTim.Text)
Dim nProc As Decimal
' Leta igenom alla kontroller som ligger i form1
For Each c In form1.Controls
' Kolla upp Label-kontrollerna
If c.GetType Is GetType(Label) Then
l1 = CType(c, Label)
' Använd boksvav nr 4 i labelns namn
strPart1 = l1.ID.Substring(3, 1)
Select Case strPart1
Case "S" ' lblSum...
Case "P" ' lblProc...
' Kontrollera resten av labelns namn, exvis "Dem" eller "Elem"
strPart2 = l1.ID.Substring(7)
' Leta upp motsvarande summakontroll
l2 = form1.FindControl("lblSum" & strPart2)
l2 = CType(l2, Label)
' Räkna ut procent
nProc = Convert.ToDecimal(l2.Text) / nSumTim * 100
' Visa värde + ev färgmarkering
l1.Text = Format(nProc, "#.#")
If nProc > 40 Or nProc < 4 Then
l1.BackColor = Drawing.Color.Red
Else
l1.BackColor = Drawing.Color.White
End If
End Select
End If
Next
End Sub
Sv: Hur förenklar jag detta för att slippa sitta och bara dumskriva?
pseudokod:
Array med kontroller
lblProcDem, lblSumDemot
lblProcElem, lblSumElem
...
SELECT SUM(x) FROM tbl GROUP BY y
for x = 1 To 40
Array(x,1).Text = Array(x,2).Text / SumTim.Text * 100
if Array(x,1).Text > 40 Or Array(x,1).Text < 4 Then
Array(x,1).BackColor = Drawing.Color.Red
end if
next