【问题标题】:How can I make textboxes appear/disappear depending on a checkbox state?如何根据复选框状态使文本框出现/消失?
【发布时间】:2018-07-10 17:06:33
【问题描述】:

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

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

我已经到了可以让文本框出现和消失的地步,但文本框永远不会为空。那里总是有一个看起来像这样的黑色方块

那些黑色方块并没有消失,我不确定到底是什么问题。 TextBox 也仅在 CheckBox 具有该正方形而不是所需的实际检查时出现。我使用了 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

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

【问题讨论】:

  • 请花点时间阅读help center 中关于如何在 Stack Overflow 上提问的网站指南。所有 relevant 代码(并且只有相关代码)都应该是 in 问题 - 没有外部链接。使用问题下方的edit 链接进行任何更改。此外,VBA 与 Visual Studio 无关。我认为 VB.NET 是有意义的,并且会相应地改变标签。
  • 发布代码图片通常会使人们对问题投反对票。始终将代码作为文本发布,并带有四个空格缩进。为什么你总是将复选框 Checked 值设置为 true?
  • 你知道你可以做像txtPav.Visible = chkPav.Checked这样的事情。在复选框的 CheckChangedEvent 内执行此操作将在每次复选框状态更改时触发代码。少了很多代码。您甚至可以组合句柄,以便将所有代码放在同一个事件中。
  • 您写道“TextBoxes 永远不会为空。那里总是有一个黑色方块......”您指的是 checkboxes 中的黑色方块,它表示它们在一个不确定的状态,或者您指的是例如“总票数”的框,它有一条可见的线?
  • 复选框的ThreeState 属性值是多少?确保它是false

标签: vb.net winforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这将处理您的所有 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
      

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2021-10-27
        相关资源
        最近更新 更多