我嘗試使用文本框進行一些計算,但結果出現錯誤正確的結果是 3700 = 4000 -300 但我得到 3667 而不是 3700 我使用此代碼
Private Sub Txtpaid_TextChanged(sender As Object, e As EventArgs) Handles Txtpaid.TextChanged
Dim totalcredit As Decimal
totalcredit = Val(Txtforhim.Text) - Val(Txtpaid.Text)
Txtforhim.Text = totalcredit.ToString
End Sub
uj5u.com熱心網友回復:
到目前為止提供的答案都沒有解決實際問題,所以我會在這里解決。您正在處理TextChangeda 的事件,每次屬性值更改TextBox時都會引發該事件。Text如果用戶在其中輸入“300” TextBox,則Text屬性將從String.Empty“3”變為“30”,最后變為“300”。這意味著該TextCahnged事件將被引發 3 次,因此您的計算將被執行 3 次。您在第二個中從“4000”開始,TextBox然后從 4000 中減去 3 并顯示結果,即“3997”。然后從中減去 30 并顯示結果,即“3967”。最后,從中減去 300 并顯示最終結果,即“3667”,
這就是為什么每個人都告訴您除錯代碼的原因。如果您一開始就這樣做了,那么您會看到事件處理程式代碼執行了 3 次,而您根本不必問這個問題。您可能不得不問另一個問題,但這仍然更好。如果代碼沒有產生您期望的結果,請始終將其作為第一步進行除錯。
現在的問題是你該怎么做。一種解決方案是停止使用控制元件作為資料存盤,并開始為此使用變數,正如您一開始就應該擁有的那樣。您的初始值,即 4000 應該存盤在一個數字變數中,并且不應該改變。然后,您將始終從相同的 4000 中減去用戶的輸入。這意味著執行 3 次計算雖然并不理想,但并不重要,因為每個結果都會簡單地覆寫前一個結果。您應該將用戶輸入轉換為數字,從一個數字變數中減去該數字,將結果存盤在另一個數字變數中,然后在控制元件中顯示該最終值。該輸出控制元件中的值永遠不會用作任何其他計算的輸入。如果需要該值,請使用存盤在變數中的數字,
uj5u.com熱心網友回復:
向函式添加斷點,這樣您就可以準確地看到代碼在該方法期間所做的事情。或者,您可以添加MsgBox()這樣的:
Private Sub Txtpaid_TextChanged(sender As Object, e As EventArgs) Handles Txtpaid.TextChanged
MsgBox($"Forhim Text: {Txtforhim.Text}{vbCrLf}Forhim Value: {Val(Txtforhim.Text)}{vbCrLf}Paid Text: {Txtpaid.Text}{vbCrLf}Paid Value: {Val(Txtpaid.Text)}")
Txtforhim.Text = (Val(Txtforhim.Text) - Val(Txtpaid.Text)).ToString()
End Sub
我也強烈建議使用Decimal.Parse()orDecimal.TryParse()代替Val(),這可能有點幼稚。
uj5u.com熱心網友回復:
該代碼正在轉換 TextBox 控制元件中的文本,然后查找差異。
這里有一些非常糟糕的設計缺陷。一方面,您應該使用 NumericUpDown 控制元件(又名 NUD)而不是 TextBox。NUD 為用戶提供了一種只輸入數值的方法。NUD 還具有回傳 Decimal的 Value 屬性(檔案)。
您還使用舊的 Visual Basic 保留,Val。Val 通過嘗試轉換字串來作業,但在它無法識別為數字的一部分的第一個字符處停止讀取字串。因此,如果您使用逗號作為小數點并使用,Val("1,23")那么此操作的結果是1因為它無法識別為數字一部分的第一個字符是逗號。如果您想繼續使用 TextBox 控制元件,那么您應該使用 Decimal.TryParse(檔案)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467002.html
標籤:VB.net
