【问题标题】:VB.NET Read 2 checkboxes status from fileVB.NET 从文件中读取 2 个复选框状态
【发布时间】:2018-05-24 17:51:03
【问题描述】:

我正在尝试恢复 2 个复选框的状态。 这两个复选框我让它们作为 radiobuttun 工作:一个被选中,另一个被取消选中。

我有一个用于程序配置的外部文件,我希望每次退出程序时,所有内容都保存在这个文件中。

为此,我使用以下代码:

   Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing

    Dim thefile As String = Application.StartupPath & "\SafetyBox.cfg"
    Dim lines() As String = System.IO.File.ReadAllLines(thefile)

    lines(1) = "Language_file=" & ComboBox1.Text
    If CheckBox1.Checked = True Then
        lines(2) = "Status1=" & "1"
    Else
        lines(2) = "Status1=" & "0"
    End If
    If CheckBox2.Checked = True Then
        lines(3) = "Status2=" & "1"
    Else
        lines(3) = "Status2=" & "0"
    End If
    System.IO.File.WriteAllLines(thefile, lines)

End Sub`

这部分工作得很好。 status1应该是checkbox1的状态,status2是checkbox2的状态。

不起作用的代码是:

 Dim path As String = Application.StartupPath & "\SafetyBox.cfg"
    If File.Exists(path) Then

        Using sr As StreamReader = New StreamReader(path)

            Dim linenew As String = sr.ReadLine()
            If linenew.Contains("\") Then
                TextBox1.Text = linenew



            Else
                MsgBox("Configura il programma da usare")
            End If

            Dim lineN As String = sr.ReadLine()
            If lineN.Contains("Language_file=") Then
                ComboBox1.Text = lineN.Split("=").Last()
            End If
            If lineN.Contains("Status1=1") Then
                CheckBox1.Checked = True
                CheckBox2.Checked = False

            ElseIf lineN.contains("Status1=0") Then
                CheckBox1.Checked = False
                CheckBox2.Checked = True

            End If



            If lineN.Contains("Status2=1") Then
                CheckBox1.Checked = False
                CheckBox2.Checked = True

            ElseIf lineN.Contains("Status2=0") Then
                CheckBox1.Checked = True
                CheckBox2.Checked = False
            End If
                sr.ReadToEnd()
            sr.Close()
        End Using

你能让我明白我的错误在哪里吗?为什么在.cfg文件中正确写入Status1 = 0和Status2 = 1时,加载程序时我总是看到checkbox1被选中而不是checkbox2?

谢谢

【问题讨论】:

  • 如果CheckBoxesRadioButtons 一样被使用,那么你为什么不使用RadioButtons?另外,如果状态总是相反,为什么需要保存两个值?
  • 嗨。感谢你及时的答复。我没有使用单选按钮,因为在这种情况下它们让我的生活变得复杂。
  • RadioButtons 并不复杂。如果您想要它们提供的行为,我可以看到您不会使用它们的唯一原因是如果您想要不同父控件上的两个控件。只有具有相同父级的RadioButtons 作为一个组。当然,如果这就是原因,那么当我问你为什么不使用它们时,你可能应该这么说。
  • 第二个代码 sn-p 相当糟糕。我不确定你为什么不像在第一个 sn-p 中那样打电话给File.ReadAllLines。这很可能会将事情简化到您不会犯错误的程度。
  • 对不起,我的评论在我完成之前就开始了嗨。感谢你及时的答复。我没有使用单选按钮,因为在这种情况下它们让我的生活变得复杂。该程序是多语言的。有几个语言文件,用户也可以创建和翻译自己的语言,所以必须保存 2 个值,因为我个人没有找到替代方案,因为我的经验有限。如果您有任何建议,那就太好了。再次感谢您的帮助:)

标签: vb.net checkbox


【解决方案1】:

您写道,您将CheckBoxes 用作RadionButtons。我怀疑要执行此操作,您处理了 CheckedChangedCheckStateChanged 事件中的一个或两个。

这样当 CheckState 改变时,另一个 Checkbox 会被适当地设置或取消设置。

当您从文件加载表单的配置/状态时,您正在设置 CheckBox 上的值,随后会导致事件被触发。为了防止事件被触发,您应该暂时从 Checkbox 控件中删除事件处理程序。

在方法的开头添加行以加载配置:

RemoveHandler Checkbox1.CheckStateChanged, AddressOf Checkbox1_CheckStateChanged
RemoveHandler Checkbox2.CheckStateChanged, AddressOf Checkbox2_CheckStateChanged

并且,在方法结束时,您需要使用以下方法重新建立事件处理程序:

AddHandler Checkbox1.CheckStateChanged, AddressOf Checkbox1_CheckStateChanged
AddHandler Checkbox2.CheckStateChanged, AddressOf Checkbox2_CheckStateChanged

如果这是问题所在,那么当表单具有多个响应 xxxChanged 事件的事件处理程序时,您遇到的问题已经很常见了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多