2016-06-14 1 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

Integerではなく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バージョンを使用する場合は、これを使用して文字列値を解析する必要があります。

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 overloadがあり、MidpointRounding列挙からの値を指定できます。この列挙は、.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'に小数点のあるものがある場合は、それをdoubleとして解析する必要があります。それを整数のように扱いたい場合は、整数に丸めます。 'lblResultadoTotal'に整数だけが含まれていることが保証されている場合は、整数に直接解析し、丸めをスキップできます。明らかに、それは他の議論で明らかなように、そうではありません。 –

+0

このラベルにはダブルも付きます。だから私は 'Convert.toDouble'を行うべきですか? –

関連する問題