2017-05-30 7 views
0

数字の間に選択するケースを試します。各150000はTextbox5がクリックボタンで変わるコードです。数字の間のケースを選択

Select Case TextBox5.Text 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
End Select 

私は1050006に900006の間の任意の数をしようとしたとき、私は「+細胞外」ではない「+ 6」 と私が持っている1050006の上にしようとしてい「 - 」

+0

Ok ... Dim range as Integer range = TextBox5.Text – Jamyz

+0

2つの等しく正解を受け取ったにもかかわらず、文字列を整数にキャストしようとしていますか? – Mike

+4

オプションを有効にしてください – Plutonix

答えて

-1
Dim i as Long 
If Long.TryParse(TextBox5.Text, i) 
    Select Case i 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
    End Select 
Else 
    TextBox6.Text = "Not a Number" 
End If 

を変更してください要件。

+0

よろしくお願いします....うまく動作します! – Jamyz

+2

@Mike多分私は言い返すべきです。それは***品質の答えではない***、あなたは説明がありません**またはOPのコードが動作していなかった理由について**詳細。あなたの答えをバックアップするには、***コード***が動作していなかった理由を明確にする必要があります。 – Codexer

+0

@Codexer - 私は彼にソリューションとはるかに洗練されたソリューション、IMHOを与えました。彼が使用しているソリューションであれば、私の答えは解決策として受け入れられるはずです。このような行動は人々が質問に答えることを妨げている。 – Mike

6

などのIDを避けます。しかし、それが原因であるかどうかを調べる前に、正しい方法を教えてください。Stringは数字ではありません。Option StrictOnとタイプセーフなコードを使用する方法を学んでください。コンパイラがあなたが達成しようとしていることを推測させないでください。

あなたはInt32.TryParseを使用することができます。

Dim number As Int32 
If Not Int32.TryParse(TextBox5.Text, number) Then 
    MessageBox.Show("Please enter a valid integer") 
    Return 
End If 

Select Case number ' now integer is the target type 
    Case 0 To 150000 
     TextBox6.Text = "-" 
    Case 150001 To 300001 
     TextBox6.Text = "+1-" 
    Case 300002 To 450002 
     TextBox6.Text = "+2-" 
    Case 450003 To 600003 
     TextBox6.Text = "+3-" 
    Case 600004 To 750004 
     TextBox6.Text = "+4-" 
    Case 750005 To 900005 
     TextBox6.Text = "+5-" 
    Case 900006 To 1050006 
     TextBox6.Text = "+6-" 
    Case Else 
     TextBox6.Text = "+Extra-" 
End Select 

これは仕事とOption Strict Onでもコンパイルされます。

なぜコードが機能しないのですか?最後の範囲をCase 900006 To 999999に変更すると、期待どおりに動作します。これは、文字列の比較方法を行う必要があります。これをコンパイル(Strict Off)しても、900006 To 1050006"900006" To "1050006"のように文字列として扱われるため、左から右へ文字の文字が比較されます。"9""1"より大きいです。この条件は決して真ではありません最後のCaseではなく、Case Elseに入ることはありません。

Documentation:expressionlistで

式は任意のデータ型にすることができ、は が、彼らはそれは二つのタイプに有効ですtestexpressionの種類と 適切な比較演算子に暗黙的に変換されて現在は となっています。 Option Strict Offexpressionlist(範囲)で

は(理由TextBox5.Textの)Stringあるtestexpressionの型に変換されます。 StringIntegerではないので Option Strict Onを使用すると、正しくコンパイルエラーを取得:へ

オプション厳密には に「整数」から暗黙の型変換を禁止する「文字列」

+0

いい答えと説明ですが、このケースは文字列として評価されています(比較について言及したように)...私は実際にこの文字を見たことが何度か分かりません... – Codexer

+0

@Codexer :はい、[documentation](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement)には次のように書かれています:_ "彼らは暗黙のうちにtestexpressionのタイプ "_したがって、最初に指定するものがすべてのケースのターゲットタイプになります。 'Option Strict Off'を指定すると、コンパイラは型を変換しようとするので、整数は文字列に変換されません**。 –

+0

あなたは正しいと言えます。素晴らしい答え! – Codexer

関連する問題