如何根据复选框状态显示/消失文本框?

时间:2018-07-10 17:06:34

标签: vb.net winforms

我有一个正在为学校项目开发的应用程序。这就是应用程序的样子 enter image description here

基本上,每当选中其中一个CheckBoxes时,TextBox.Visible属性都将更改为true,并应出现在复选框下方。只要愿意,您都可以选中所有三个(或选中任何组合),只要取消选中它,TextBox就会消失,并且CheckBox会显示为空白/未选中。

我已经到了可以使TextBoxes出现和消失的地步,但是TextBoxes永远不会为空。那里总是有一个黑色的正方形,看起来像这样 enter image description here

那些黑色方块不会消失,我不确定到底是什么问题。仅当CheckBox具有该正方形而不是所需的实际检查时,才会出现TextBox。我使用了If ... ElseIf语句和Select Cases的组合,但尚未完成。我尝试了一些其他事件,例如CheckChanged和Click。

这是我当前使用的允许我切换框的代码。

Private Sub chkBox_Click(sender As Object, e As EventArgs) Handles chkBox.Click

    If chkBox.Checked = False Then
        txtBox.Visible = False
        txtBox.Text = ""
    Else
        txtBox.Visible = True
    End If
    chkBox.Checked = True

End Sub

Private Sub chkLawn_Click(sender As Object, e As EventArgs) Handles chkLawn.Click

    If chkLawn.Checked = False Then
        txtLawn.Visible = False
        txtLawn.Text = ""
    Else
        txtLawn.Visible = True
    End If
    chkLawn.Checked = True


End Sub

Private Sub chkPav_Click(sender As Object, e As EventArgs) Handles chkPav.Click
    If chkPav.Checked = False Then
        txtPav.Visible = False
        txtPav.Text = ""
    Else
        txtPav.Visible = True
    End If
    chkPav.Checked = True
End Sub

如果你们能想到一个解决方案或可以向我指出正确的方向,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

我建议在表单加载中使用它来设置复选框和文本框之间的关系:

chkBox.Tag = txtBox
chkLawn.Tag = txtLawn
chkPav.Tag = txtPav

然后是一个处理程序:

Private Sub chkBox_Click(sender As Object, e As EventArgs) Handles chkBox.Click, chkPav.Click, chkLawn.Click
     CType(sender.Tag, TextBox).Visible = CType(sender, Checkbox).Checked
End Sub

答案 1 :(得分:0)

这将处理所有CheckBox.CheckChanged事件。它根据CheckBox的名称查找TextBox。因此,只需将它们命名为与您相同的名称(即chkA和txtA)。

Private textBoxPrefix As String = "txt"
Private checkBoxPrefix As String = "chk"

Private Sub chk_CheckedChanged(sender As Object, e As EventArgs) Handles chkBox.CheckedChanged, chkLawn.CheckedChanged, chkPav.CheckedChanged
    Dim chk = CType(sender, CheckBox)
    Dim suffix = chk.Name.Substring(checkBoxPrefix.Length)
    Dim txt = Me.Controls().Find(textBoxPrefix & suffix, True).Single()
    txt.Visible = chk.Checked
    txt.Text = If(chk.Checked, "", txt.Text)
End Sub

使其更具可伸缩性,以编程方式将处理程序添加到Form_Load的GroupBox中的所有CheckBox中。 (从事件处理程序的声明中删除Handles chkBox.CheckedChanged, chkLawn.CheckedChanged, chkPav.CheckedChanged

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' assuming the GroupBox is named gbTickets, add all handlers programmatically
    For Each chk As CheckBox In Me.gbTickets.Controls.OfType(Of CheckBox)
        AddHandler chk.CheckedChanged, AddressOf chk_CheckedChanged
    Next
End Sub

答案 2 :(得分:0)

尝试删除.click事件中的chkPav.Checked = TruechkLawn.Checked = TruechkBox.Checked = True

此外,我会建议使用“ CheckStateChanged” vb.net事件。