If...Then...ElseIf语句触发时回退至初始条件的问题排查
问题:定时器触发的条件判断异常导致设置值加载错误
我有一个名为My.Settings.StirProfile的设置文件,当特定秒数流逝后,会按索引将值加载到文本框中,用If...Then...ElseIf语句控制加载逻辑。
LblTime.Text由定时器更新,显示当前秒数,我写了以下代码:
If LblTime.Text <= My.Settings.StirProfile(1) Then stirrVal.Text = My.Settings.StirProfile(0) Label12.Text = My.Settings.StirProfile(1)' Val = 58 sec Label13.Text = My.Settings.StirProfile(0)' Val = 100 rpm 'step2 ElseIf LblTime.Text = My.Settings.StirProfile(3) Then stirrVal.Text = My.Settings.StirProfile(2) Label12.Text = My.Settings.StirProfile(3)' val = 60 sec Label13.Text = My.Settings.StirProfile(2)' val= 110 rpm 'step3 ElseIf LblTime.Text = My.Settings.StirProfile(5) Then stirrVal.Text = My.Settings.StirProfile(4) Label12.Text = My.Settings.StirProfile(5) ' val= 80 sec Label13.Text = My.Settings.StirProfile(4) ' val = 120 rpm 'step4 ElseIf LblTime.Text = My.Settings.StirProfile(7) Then stirrVal.Text = My.Settings.StirProfile(6) Label12.Text = My.Settings.StirProfile(7)' val= 110 sec Label13.Text = My.Settings.StirProfile(6) ' val = 140 rpm 'step5 ElseIf LblTime.Text = My.Settings.StirProfile(9) Then stirrVal.Text = My.Settings.StirProfile(8) Label12.Text = My.Settings.StirProfile(9) Label13.Text = My.Settings.StirProfile(8) End If
异常现象
在第4步(对应My.Settings.StirProfile(7)的110秒),我期望显示110秒和140rpm,但程序却回退到第1步的索引0和1对应的数值(100rpm、58秒),尽管代码里明确指定了索引6和7。
但如果把这段赋值代码单独放在按钮点击事件里,却能得到正确的值:
Label12.Text = My.Settings.StirProfile(7)' val= 110 sec Label13.Text = My.Settings.StirProfile(6) ' val = 140 rpm
核心原因:字符串与数值的比较逻辑错误
你现在的代码直接用字符串类型的LblTime.Text和My.Settings.StirProfile里的数值做比较,触发的是字符串字典序比较,而非数值大小比较:
- 当
LblTime.Text为"110"时,作为字符串和数值58(被隐式转为字符串"58")比较,字典序里"110" < "58"(第一个字符'1' < '5'),因此会命中第一个If条件,执行第1步的逻辑。 - 按钮点击时是直接赋值,没有比较逻辑,所以能拿到正确值。
修复方案
- 统一类型后再比较:将
LblTime.Text转换为整数,和StirProfile中的数值做数值比较:
' 先把当前时间转成整数,避免字符串比较问题 Dim currentSec As Integer = Integer.Parse(LblTime.Text) If currentSec <= My.Settings.StirProfile(1) Then stirrVal.Text = My.Settings.StirProfile(0).ToString() Label12.Text = My.Settings.StirProfile(1).ToString() ' Val = 58 sec Label13.Text = My.Settings.StirProfile(0).ToString() ' Val = 100 rpm 'step2 ElseIf currentSec = My.Settings.StirProfile(3) Then stirrVal.Text = My.Settings.StirProfile(2).ToString() Label12.Text = My.Settings.StirProfile(3).ToString() ' val = 60 sec Label13.Text = My.Settings.StirProfile(2).ToString() ' val= 110 rpm 'step3 ElseIf currentSec = My.Settings.StirProfile(5) Then stirrVal.Text = My.Settings.StirProfile(4).ToString() Label12.Text = My.Settings.StirProfile(5).ToString() ' val= 80 sec Label13.Text = My.Settings.StirProfile(4).ToString() ' val = 120 rpm 'step4 ElseIf currentSec = My.Settings.StirProfile(7) Then stirrVal.Text = My.Settings.StirProfile(6).ToString() Label12.Text = My.Settings.StirProfile(7).ToString() ' val= 110 sec Label13.Text = My.Settings.StirProfile(6).ToString() ' val = 140 rpm 'step5 ElseIf currentSec = My.Settings.StirProfile(9) Then stirrVal.Text = My.Settings.StirProfile(8).ToString() Label12.Text = My.Settings.StirProfile(9).ToString() Label13.Text = My.Settings.StirProfile(8).ToString() End If
- 额外优化建议:
- 加入
Integer.TryParse做异常处理,避免LblTime.Text无法转成整数的情况; - 用
=匹配特定秒数可能因定时器精度问题错过触发,可改成区间判断(如currentSec > 上一步时间 AndAlso currentSec <= 当前步时间),逻辑更健壮。
- 加入
内容的提问来源于stack exchange,提问作者Glen van Niekerk
相关产品推荐
相关产品推荐

