2017-05-30 94 views
0

我嘗試選擇數字之間的情況。每個150000代碼Textbox5在點擊按鈕上進行更改。Select Number between number

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 

當我試圖900006之間的任意數字到1050006我有 「+預算外」 而不是 「+ 6-」 ,並嘗試在1050006我有 「 - 」

+0

好的...我發現昏暗的範圍作爲整數範圍= 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 - 我給了他的解決方案,和一個更加優雅的解決方案,恕我直言。如果這是我正在使用的解決方案,那麼我的答案應該是被接受爲解決方案的答案。這樣的行爲阻礙了人們回答問題。 – Mike

6

IDS這很有趣。但在我試圖找出它造成什麼之前,我爲您提供了正確的方法: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,它將按預期工作。這必須如何比較字符串。即使這個編譯(嚴格關)Case將把範圍900006 To 1050006作爲字符串,如"900006" To "1050006",所以他們比較字母從左到右的信件,sinvce "9"是「大於」"1"這種情況從來不是真的,這就是爲什麼你永遠不要進入最後的Case,而是進入Case Else

Documentation

在與expressionlist的表達可以是任何數據類型,提供 它們隱式轉換爲testexpression與的類型和 適當的比較運算符是有效的兩種類型是與 一起使用。

隨着Option Strict Offexpressionlist(的範圍)被轉換成是String(因爲TextBox5.Text)的testexpression類型。 隨着Option Strict On你正確地得到一個編譯器錯誤,因爲String不是Integer

選項嚴格On不允許從「整數」隱式轉換爲 「串」

+0

很好的答案和解釋,案件被視爲字符串評估(正如你提到的比較)...我不知道有多少次我真的看到這個咬人... – Codexer

+0

@Codexer :是的,[文檔](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement)提到它:_「它們可以隱式轉換爲testexpression的類型「_因此,您首先指定的是所有情況下的目標類型。使用'Option Strict Off',編譯器會嘗試轉換類型**,所以整數將被轉換爲字符串,反之亦然**。 –

+0

你是對的,正如前面提到的一如既往;很好的回答! – Codexer