2016-06-14 2 views
1

레이블에 표시되는 값에 따라 다른 색상으로 반환 할 클래스에서 함수를 호출하고 있습니다.클래스에서 값을 폼으로 반환

Function GetLabelColor(value As Integer) As Color 
    If value <= 3.9 Then 
     Return Color.Green 
    ElseIf (value >= 4) And (value <= 6.9) Then 
     Return Color.Orange 
    ElseIf value >= 7 Then 
     Return Color.Red 
    End If 
End Function 

그리고 형태로 내가 전화를이 코드를 사용하고 : : 아래의 방법이다

Dim uicommon = New CommonUI() 
Dim labelColor = uicommon.GetLabelColor(Integer.Parse(lblResultadoTotal.Text)) 

lblResultadoTotal.ForeColor = labelColor 
lblGB.ForeColor = labelColor 

그러나 어떤 이유로 나에게 값이 경우에도 단지 녹색 색상을 반환합니다 3.9보다 크다. 나를 도울 수있는 해결책이 있습니까?

+1

이 값을 실제로 전달하는 값은 무엇입니까? – Steve

+0

Integer.Parse ("3.9")'를 실행하려고하면 예외가 발생합니다. 예외를 무시하고있을 가능성이 있습니까? 나는 당신이 [mcve]를 창조 할 것을 제안한다. – Heinzi

+0

코드를 시도했지만 문제를 재현 할 수 없습니다. (물론 Integer.Parse로 "1"또는 "5"또는 "9"와 같은 정수로 변환 할 수있는 문자열을 전달합니다.) 정수 대신 double 값으로 전환하면 코드에 버그가 있음을 유의하십시오 3.91 (또는 6.91)의 값으로 인해 코드가 실패하게됩니다. – Steve

답변

0

정수 대신 Double을 사용해야합니다.

+0

잘 작동하지 않습니다. –

+0

구문 분석도 변경해야합니다. –

+0

Dim labelColor = uicommon.GetLabelColor (Convert.ToDouble (lblResultadoTotal.Text)) – hdkhardik

1

기능은 아래에 제공된 것과 같은 일을하지만 당신은 원하는 경우 정수 (정수)를 통과 그것은

Function GetLabelColor(value As Double) As Color 

    If (value >= 4) And (value < 7) Then 
     Return Color.Orange 
    ElseIf value >= 7 Then 
     Return Color.Red 
    End If 
    Return Color.Green 
End Function 

에 전달하는 등 3.9으로 소수를 허용하는 더블을 받아 정수 값이 3.9와 같지 않으므로 값을 < = 3.9와 같이 비교하면 안됩니다. 대신이 버전을 사용할 수 있습니다.

Function GetLabelColor(value As Integer) As Color 

    If (value >= 4) And (value <= 6) Then 
     Return Color.Orange 
    ElseIf value > 6 Then 
     Return Color.Red 
    End If 
    Return Color.Green 
End Function 

두 가지 버전의 방법을 사용하는 경우이 값을 사용하여 문자열 값을 구문 분석해야합니다. 당신이 값을받지 않으면

Double.Parse(lblResultadoTotal.Text) 

당신은 그것을 전달되는 당신의 방법하지만 값이 문제가되지 않습니다 기대합니다. 이것을 테스트하기 위해 값을 하드 코딩 해보십시오. 즉 Integer.Parse (lblResultadoTotal.Text)를 실제 숫자로 바꿉니다. 5 당신이 기대하는 색깔을 얻는 지보십시오.

이 값 10.4

Imports System.Drawing 

Module Module1 

Sub Main() 

    Console.WriteLine(GetLabelColor(Double.Parse("10.4"))) 

    Console.ReadLine() 
End Sub 

Function GetLabelColor(value As Double) As Color 

    If (value >= 4) And (value <= 6) Then 
     Return Color.Orange 
    ElseIf value > 6 Then 
     Return Color.Red 
    End If 
    Return Color.Green 
End Function 

End Module 
+0

현재 내가 가지고있는 값 레이블이 10.4이므로이 경우 빨강 색을 얻고 대신 녹색 색을 사용합니다 –

+0

if 문을 인식하지 못하는 것처럼 보입니다. 그러면 색상이 녹색으로 변합니다. –

+0

내 대답을 편집했습니다. 당신이 아직도 초록색을 띠고 있다고 말할 때 나는 당신이 글자 그대로 글자를보고 있다고 가정하고 녹색으로 보입니다. 이 상황이 발생하고 값 10.4를 확신하는 경우 레이블 색상 –

0

을위한 그러나이 값이 3.9보다 큰 경우에도 나에게 단지 녹색 색상을 반환합니다 어떤 이유로 작업을 설명 할 수있는 간단한 콘솔 응용 프로그램을 보여줍니다. 나를 도울 수있는 해결책이 있습니까?

"3.9 이상"은 "> = 4"와 같지 않습니다. 수 이론에서 3.9와 4.0 사이의 값은 무한합니다. 이진 부동 소수점 표현의 현실은 실제로는 무한히 많지는 않지만 조금씩 변하지 만 여전히 많은 저주가 있습니다. 어떤 상황에서도 3.9는> = 4.0과 비교할 수 없습니다.

3.9가 4.0처럼 작동하도록하려면 값을 정수 (정수)로 반올림해야합니다. 이를 수행하는 기본 제공 방법은 Math.Round입니다. an overloadMidpointRounding 열거 형의 값을 지정할 수있게 해줍니다.이 열거 형은 .5로 끝나는 번호를 처리하는 방법을 제어합니다. 예를 들어 AwayFromZero은 2.5에서 4.0으로 반올림하고 ToEven에서는 3.0으로 반올림합니다. 3.5의 경우 결과는 두 경우 모두 동일합니다.

Function GetLabelColor(value As Double) As Color 
    Dim roundedValue As Integer = Math.Round(value, MidpointRounding.AwayFromZero) 
    If (roundedValue >= 4) AndAlso (roundedValue < 7) Then 
     Return Color.Orange 
    ElseIf roundedValue >= 7 Then 
     Return Color.Red 
    Else 
     Return Color.Green 
    End If 
End Function 

참고 : 당신은 아마 오히려 And보다, 당신의 상태에 AndAlso을 사용하고 싶습니다. 두 경우 모두 결과는 동일하지만 AndAlsoOrElse이 바람직한 논리 연산자입니다.AndOr 연산자는 비트 단위로 연산에 예약되어 있습니다. 여기서는 수행하지 않습니다. 그리고 당신이하는 일은 거의 없습니다.

+0

그래서 이것을 부를 때, 양식에있는 것과 동일한 코드? –

+0

'lblResultadoTotal'에 소수점이있는 뭔가가 있으면 yes로 두 번 분석해야합니다. 정수처럼 취급하려면 정수로 반올림하십시오. 'lblResultadoTotal'가 정수만을 포함하도록 보장된다면, 정수로 직접 파싱하고 반올림을 건너 뛸 수 있습니다. 분명히 그렇지 않습니다. 다른 토론에서 입증되었습니다. –

+0

이 라벨에는 이중 라벨이 붙어 있습니다. 그래서 나는 'Convert.toDouble'을해야합니까? –

관련 문제