【问题标题】:Radio buttons fire in VB net at form load单选按钮在表单加载时在 VB 网络中触发
【发布时间】:2017-11-21 11:10:36
【问题描述】:

我有一个简单的 VB 网络表单,在组框中有两个单选按钮,组框外的按钮调用另一个设置其他参数的表单。单选按钮都通过串行端口发送数据。 Form1_load 事件有一个布尔值form_loading = True。这在 rbtn 处理程序中进行检查,如果为 true,则应退出子例程。在调试时,检查更改甚至会触发一个在设计时检查的按钮事件,此时form_loading 值设置为 false,我不知道为什么。没有form_loading = false 声明。如果我删除 rbtn 处理程序,form_loading = True 在调用并返回另一个表单时仍然存在。带有按钮的组框被激活,因为它在表单加载时看到 rbtn1-CheckChanged 并且form_loading 值设置为 false。我怀疑 rbtn 事件在表单开始加载时触发,在到达 form_loading = True 语句之前,但我如何阻止它触发按钮事件? 就目前而言,当调试开始时,有一个IO异常错误:

串口已关闭,与按钮相关的代码在 发送到(关闭的)com 端口的缓冲区

Private Sub rbtnDon_CheckedChanged(sender As Object, e As EventArgs) Handles rbtnDon.CheckedChanged
    If form_loading Then
        Exit Sub
    ElseIf rbtnDoff.Checked = True Then 'event fires when other button checkchanged = true,  this stops it
        Exit Sub
    Else
        data_out = (SOT + "N" + EOT)
        SendtoBoard(data_out)
    End If
End Sub`enter code here`

【问题讨论】:

  • “Form1_load 事件有一个布尔值” 我不明白这一点。也许你应该包括Form1_load。因为如果那是该事件处理程序中的局部变量,您应该无法在此处访问它。它的初始值为true,并且没有代码将其设置为false?那么rbtnDon_CheckedChanged中的false是不可能的。
  • 在表单的New() 方法中设置form_loading 变量或使用反向逻辑 - 声明form_loaded 并在表单加载/激活后设置它true
  • VB.NET IDE 隐藏了窗体的构造函数,这对您没有帮助。键入“Sub New”,然后按 Enter。并且确实考虑更改您的 UI,通常明智的做法是仅在选中单选按钮时才做一些重要的事情。因此,您会倾向于另一个按钮的 CheckedChanged 事件处理程序来执行此操作。
  • ElseIf rbtnDoff.Checked = True Then >> 也许应该是 == 因为你在这里检查 rbtnDoff...

标签: vb.net


【解决方案1】:

感谢大家的帮助。在其他地方我发现了这个提示:从 sub 中删除“handles rbtnDon checkchanged”:

Private Sub rbtnDon_CheckedChanged(sender As Object, e As EventArgs)handles rbtnDon checkchanged

并将其添加到 form1_load sub:

AddHandler rbtnDon.CheckedChanged, New EventHandler(AddressOf rbtnDon_CheckedChanged)

这似乎彻底解决了问题。

我无法在原始帖子中添加启动代码,因为出于某种原因,该框不会接受两个单独的代码 - 或者我做得不对: 在这里:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    For i As Integer = 0 To My.Computer.Ports.SerialPortNames.Count - 1
        ccbComPort.Items.Add(My.Computer.Ports.SerialPortNames(i))
    Next
    If ccbComPort.Items Is Nothing Then
        lblMessage.ForeColor = Color.Red
        lblMessage.Text = "No Serial Ports found"
    Else
        ccbComPort.Text = My.Settings.oldPort
    End If
    ccbBaudrate.Text = My.Settings.oldBaud
    pnlComPorts.Visible = True
    'form_loading = True

    rbtnDon.Enabled = True
    AddHandler rbtnDon.CheckedChanged, New EventHandler(AddressOf rbtnDon_CheckedChanged)
End Sub

最初我有一个带有 Com 端口设置面板的表单,一切都很好,问题只是在我将端口设置移动到 form2 时才开始,之后在 form1 启动之前触发了 rbtnDon 事件。 我确实尝试了 Sub New() 方法,但后来我在调试时得到了一个小的空白表单。将 Form1_load 添加到它会导致“NotImplemented Exception”。

上面描述的方法看起来不错,而且添加起来相当简单,但可能不是一个好习惯?

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2017-04-05
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多