首页 > 解决方案 > 更改复选框时预览不同的文本

问题描述

我没有找到任何解决问题的方法,也许是因为我无法正确表达我真正想做的事情。
基本上,我有 4 个CheckBoxes,当其中一些被选中时,我想在TextBox多行中添加一些文本。

例子:

If checkbox1.checked = true then
     Textbox1.text = text1
Elseif checkbox1.checked = true and checkbox2.checked = true then
     Textbox1.text = text1 & vbCrLf & text2
Elseif checkbox1.checked = true and checkbox2.checked = true and checkbox3.checked = true then
     Textbox1.text = text1 & vbCrLf & text2 & vbCrLf & text3    
Elseif checkbox1.checked = true and checkbox3.checked = true then
     textbox1.text = text1 & vbCrLf & text3
End if

我知道代码中有一个逻辑错误(如果我CheckBoxes检查了 4 个,它将只显示text1而不是text1 & vbCrLf & text2 & vbCrLf & text3 & vbCrLf & text4),但我不知道如何以另一种方式表达我的问题。

CheckBoxes如果我检查我想查看的第一个和第三个,text1并且text3相应地,我是否必须对我可以检查的每一种可能的方式进行硬编码,CheckBoxes或者是否有一种方法可以自动在新行上添加我需要的文本?

标签: vb.netwinforms

解决方案


我建议您首先将与每个对应的文本分配给 thatCheckBoxTag属性CheckBox。你可以在设计器中做到这一点。然后,您可以获取复选框列表,获取每个复选框的文本并将它们连接在一起,例如

Dim checkBoxes = {CheckBox1, CheckBox2, CheckBox3, CheckBox4}

TextBox1.Text = String.Join(Environment.NewLine,
                            checkBoxes.Where(Function(cb) cb.Checked).
                                       Select(Function(cb) CStr(cb.Tag)))

这将创建一个 all 列表,将CheckBoxes其过滤为仅选中的那些,获取每个文本的文本,然后String使用换行符作为分隔符将这些子字符串连接成一个。对于那些更喜欢 LINQ 查询语法而不是函数语法的人:

Dim checkBoxes = {CheckBox1, CheckBox2, CheckBox3, CheckBox4}

TextBox1.Text = String.Join(Environment.NewLine,
                            From cb In checkBoxes
                            Where cb.Checked
                            Select CStr(cb.Tag))

如果您不想走 LINQ 路线,那么您可以使用更传统的循环:

Dim checkBoxes = {CheckBox1, CheckBox2, CheckBox3, CheckBox4}
Dim substrings As New List(Of String)

For Each cb In checkBoxes
    If cb.Checked Then
        substrings.Add(CStr(cb.Tag))
    End If
Next

TextBox1.Text = String.Join(Environment.NewLine, substrings)

推荐阅读