Springen naar inhoud


- - - - -
VS 2015

Datagridview Cel Kleuren Volgens Maximum En Minimum Waarden.

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 7 reacties in dit onderwerp

#1 Luc2803

Luc2803

    Starting Developer

  • Leden
  • 15 berichten
    Laatst bezocht 14 jun 2021 11:40

Geplaatst op 15 februari 2021 - 15:12

Ik heb een Datagridview en aan de hand van de maximum en minimum waarde in een kolom zou ik de cel een bepaalde kleur geven.
De onderstaande code werkt, maar het kleurt de 3 hoogste en laagste waarden.

Hoe kan ik de code aanpassen zodat het maar één waarde geeft en voor meerdere kolommen.

Code:
Dim max As Integer
		Dim min As Integer
		For i As Integer = 0 To DataGridView1.Rows.Count() - 2 Step 1
			If i = 0 Then
				max = DataGridView1.Rows(i).Cells(3).Value
			ElseIf max < DataGridView1.Rows(i).Cells(3).Value Then
				max = DataGridView1.Rows(i).Cells(3).Value
				DataGridView1.Rows(i).Cells(3).Style.BackColor = Color.FromArgb(255, 189, 194)
			End If
			If i = 0 Then
				min = DataGridView1.Rows(i).Cells(3).Value
			ElseIf min > DataGridView1.Rows(i).Cells(3).Value Then
				min = DataGridView1.Rows(i).Cells(3).Value
				DataGridView1.Rows(i).Cells(3).Style.BackColor = Color.FromArgb(160, 242, 181)
			End If
		Next



#2 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1423 berichten
    Laatst bezocht 18 apr 2022 09:09
  • LocatieBrugge

Geplaatst op 17 februari 2021 - 17:58

Dag Luc,

Je zal het kleuren van de kleinste en grootste rij moeten uitstellen tot na de lus, enkel dan ben je zeker dat je de juiste waarde hebt gevonden. Anders zal je van een rij getallen die oplopend zijn altijd zien dat alles groter is dan de rijen er voor.

Een mogelijke oplossing:
Code:
If DataGridView1.Rows.Count > 0 Then
  Dim minRows As New List(Of Integer) From { 0 }
  Dim maxRows As New List(Of Integer) From { 0 }
  Dim min As Integer = DataGridView1.Rows(0).Cells(3).Value
  Dim max As Integer = min
  For i As Integer = 1 To DataGridView1.Rows.count - 2
	Dim currentValue As Integer = DataGridView1.Rows(i).Cells(3).Value
	If min = currentValue Then
	  minRows.Add(i)
	Else If min > currentValue Then
	  min = currentValue
	  minRows.Clear()
	  minRows.Add(i)
	End If

	If max = currentValue Then
	  maxRows.Add(i)
	Else If max < currentValue Then
	  max = currentValue
	  maxRows.Clear()
	  maxRows.Add(i)
	End If
  Next

  For Each row In minRows
	DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(255, 189, 194)
  Next
  For Each row In maxRows
	DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(160, 242, 181)
  Next
End If

Waarschuwing, code uit de losse pols geschreven, kan fouten bevatten, kijk altijd code na die je vind op het internet.

Ik zoek dus eerst welke rijen de grootste en kleinste waarde hebben. Omdat er meerdere rijen kunnen zijn met dezelfde waarden bewaar ik dit in een array. Als ik een nieuwe rij tegen kom die toch groter of kleiner is, dan maak ik de array met reeds gevonden rijen leeg en voeg de huidige rij toe als rij met de kleinste/grootste waarde.

Op het einde overloop ik de rijen met de kleinste en grootste waarde en kleur ik deze.

Hopelijk helpt dit.

#3 Luc2803

Luc2803

    Starting Developer

  • Leden
  • 15 berichten
    Laatst bezocht 14 jun 2021 11:40

Geplaatst op 18 februari 2021 - 16:34

Dag Supervos,

Hartelijk dank voor jouw uit de losse pols geschreven code.

Er is echter een probleem als er 1 of meerdere 0 in de kolom aanwezig zijn, want de 0 is steeds het kleinste getal.

Ik heb geprobeerd met de volgende aanpassing.
De waarde 0 wordt niet meer gekleurd. Dus hiervoor werkt de aanpassing wel.

Er is echter wel een probleem met de kleinste waarde, want deze wordt niet meer gekleurd.
Wat doe ik fout?

Code:

If DataGridView1.Rows.Count > 0 Then
			Dim minRows As New List(Of Integer) From {0}
			Dim maxRows As New List(Of Integer) From {0}
			Dim min As Integer = DataGridView1.Rows(0).Cells(3).Value
			Dim max As Integer = min
			For i As Integer = 1 To DataGridView1.Rows.Count - 2
				Dim currentValue As Integer = DataGridView1.Rows(i).Cells(3).Value
				Dim zeroValue as integer = Datagridview1.Rows(i).value = 0
				If min = zeroValue then
					minRows.Clear()
				ElseIf min = currentValue Then
					minRows.Add(i)
				ElseIf min > currentValue Then
					min = currentValue
					minRows.Clear()
					minRows.Add(i)
				End If
				If max = currentValue Then
					maxRows.Add(i)
				ElseIf max < currentValue Then
					max = currentValue
					maxRows.Clear()
					maxRows.Add(i)
				End If
			Next
			For Each row In minRows
				DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(160, 242, 181)
			Next
			For Each row In maxRows
				DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(255, 189, 194)
			Next
		End If




#4 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1423 berichten
    Laatst bezocht 18 apr 2022 09:09
  • LocatieBrugge

Geplaatst op 19 februari 2021 - 15:16

Je probleem is op regel 9, van zodra je een 0 vind zal je alle reeds gevonden rijen verwijderen. Als na deze 0 geen enkele waarde kleiner is zal je dus alle informatie hebben weg gesmeten.

De oplossing is om regel 10 te verwijderen (de "minRows.Clear()").
Je hebt dan inderdaad een lege If maar deze kan je op andere manieren wegwerken (als je hier last van hebt).

Je zou wel nog een probleem hebben als je eerste rij een waarde van 0 heeft. Als je zeker weet dat dit niet kan voorkomen kan je deze code laten zoals het is.

Als dit wel kan voorkomen kan je de "minRows" en "maxRows" als een lege array laten (dus de "From {0}" weg laten) en stel de "min" in op "Integer.MaxValue", de "max" op "Integer.MinValue". Je zorgt dan ook dat je lust begint vanaf rij 0 in plaats van 1.
Met het zetten van de "min" op de hoogste waarde die bestaat ("Integer.MaxValue") ben je zeker dat om het even welke rij je tegenkomt in je datagrid deze een kleinere waarde heeft en dus correct gekleurd zal worden. Dezelfde logica met de "max", maar hier kan je het eventueel op "0" zetten in plaats van "Integer.MinValue" als je zeker bent dat er geen negatieve getallen in je grid aanwezig zijn.

#5 Luc2803

Luc2803

    Starting Developer

  • Leden
  • 15 berichten
    Laatst bezocht 14 jun 2021 11:40

Geplaatst op 05 maart 2021 - 10:35

Supervos,

Ik heb jouw voorstel geprobeerd, maar zonder succes.
Hier is de aangepaste code:

Code:
   If DataGridView1.Rows.Count > 0 Then
			Dim minRows As New List(Of Integer)	 'From {0}
			Dim maxRows As New List(Of Integer)	'From {0}
			Dim min As Integer = Integer.MaxValue
			Dim max As Integer = Integer.MinValue
			For i As Integer = 0 To DataGridView1.Rows.Count - 2
				Dim currentValue As Integer = DataGridView1.Rows(i).Cells(3).Value
				If min = currentValue Then
					minRows.Add(i)
				ElseIf min > currentValue Then
					min = currentValue
					minRows.Clear()
					minRows.Add(i)
				End If
				If max = currentValue Then
					maxRows.Add(i)
				ElseIf max < currentValue Then
					max = currentValue
					maxRows.Clear()
					maxRows.Add(i)
				End If
			Next
			For Each row In minRows
				DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(160, 242, 181)
			Next
			For Each row In maxRows
				DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(255, 189, 194)
			Next
End if


Wat doe ik verkeerd?

#6 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1423 berichten
    Laatst bezocht 18 apr 2022 09:09
  • LocatieBrugge

Geplaatst op 10 maart 2021 - 23:08

Je slaat de rijen met een waarde van 0 niet meer over waardoor je alle rijen met een waarde van 0 kleurt.

Je kan deze gemakkelijk overslaan met volgende code:
Code:
If DataGridView1.Rows.Count > 0 Then
		 Dim minRows As New List(Of Integer)
		 Dim maxRows As New List(Of Integer)
		 Dim min As Integer = Integer.MaxValue
		 Dim max As Integer = Integer.MinValue
		 For i As Integer = 0 To DataGridView1.Rows.Count - 2
			 Dim currentValue As Integer = DataGridView1.Rows(i).Cells(3).Value
If currentValue = 0 Then
Continue For
End If
			 If min = currentValue Then
				 minRows.Add(i)
			 ElseIf min > currentValue Then
				 min = currentValue
				 minRows.Clear()
				 minRows.Add(i)
			 End If
			 If max = currentValue Then
				 maxRows.Add(i)
			 ElseIf max < currentValue Then
				 max = currentValue
				 maxRows.Clear()
				 maxRows.Add(i)
			 End If
		 Next
		 For Each row In minRows
			 DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(160, 242, 181)
		 Next
		 For Each row In maxRows
			 DataGridView1.Rows(row).Cells(3).Style.BackColor = Color.FromArgb(255, 189, 194)
		 Next
End if


Stel dat het nog altijd verkeerd is, kan je dan met een klein voorbeeld duidelijk maken wat je nu van resultaat krijgt en wat je wenst te krijgen?
Daarnaast zie ik dat je de laatste rij overslaat (de for lust wordt met 2 geminderd), is dit de bedoeling of niet?

#7 Luc2803

Luc2803

    Starting Developer

  • Leden
  • 15 berichten
    Laatst bezocht 14 jun 2021 11:40

Geplaatst op 11 maart 2021 - 11:39

Ik heb dus een datagridview met verschillende kolommen.
In enkele kolommen wens ik de minimum en maximum waarden te kleuren.
Jouw code, waarvoor dank, werkt perfect indien er geen 0 in de rij aanwezig is.

Ik moet er nog aan toevoegen dat ik dezelfde code aanpas voor de verschillende cellen (3,6,9,...) waar ik deze wil kleuren.
Kan geen afbeelding toevoegen.


#8 Luc2803

Luc2803

    Starting Developer

  • Leden
  • 15 berichten
    Laatst bezocht 14 jun 2021 11:40

Geplaatst op 17 maart 2021 - 15:57

Ik heb zelf voor de oplossing kunnen zorgen.
Het is misschien niet de meest effectieve code, maar ze werkt.

Code:
  Dim Max As Decimal = 0
		For Each rws As DataGridViewRow In DataGridView1.Rows
			If rws.Cells(3).Value Is Nothing Or rws.Cells(3).Value = 0 Then
			Else
				If Max < rws.Cells(3).Value Then Max = rws.Cells(3).Value
			End If
		Next
		Dim Min As Decimal = Max
		For Each rws As DataGridViewRow In DataGridView1.Rows
			If rws.Cells(3).Value Is Nothing Or rws.Cells(3).Value = 0 Then
			Else
				If Min > rws.Cells(3).Value Then Min = rws.Cells(3).Value
			End If
		Next
' kleuren van de cellen
  If e.ColumnIndex = 3 AndAlso e.Value = Min Then
			e.CellStyle.BackColor = Color.FromArgb(254, 184, 189)
			e.CellStyle.ForeColor = Color.Red
		ElseIf e.ColumnIndex = 3 AndAlso e.Value = Max Then
			e.CellStyle.BackColor = Color.FromArgb(183, 255, 183)
			e.CellStyle.ForeColor = Color.DarkGreen
		End If



Alvast hartelijk voor je hulp.





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)