更改复选框后预览其他文本

时间:2018-10-08 22:22:48

标签: vb.net winforms

我没有找到解决问题的方法,可能是因为我无法正确表达自己真正想做的事情。
基本上,我有4个public static void duplicateExists(String [] array) { Set<String> hs = new HashSet<String>(); for (String ar : array) { // System.out.println(hs.add(ar)); if((hs.add(ar)) == false); { System.out.println("reaches here every time but shouldn't "); } } } public static void main(String[] args) { duplicateExists(new String[] {"1","2","5","3","6","8"}); } ,并且选中其中一些时,我想向多行CheckBoxes中添加一些文本。

示例:

TextBox

我知道代码中存在逻辑错误(如果我检查了4个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而不是text1),但我不知道该如何表达问题是另一种方式。

如果我想分别查看第一个text1 & vbCrLf & text2 & vbCrLf & text3 & vbCrLf & text4和第三个CheckBoxes,而我想分别查看{{1 }}还是有一种方法可以自动在新行中添加我需要的文本?

3 个答案:

答案 0 :(得分:3)

我建议您首先将与每个CheckBox相对应的文本分配给该Tag的{​​{1}}属性。您可以在设计器中执行此操作。然后,您可以只获取一个复选框列表,获取每个复选框的文本并将其合并在一起,例如

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))) 的列表,将其过滤为仅选中的列表,获取每个列表的文本,然后使用换行符作为分隔符将这些子字符串连接到单个CheckBoxes中。对于那些更喜欢LINQ查询语法而不是函数语法的人:

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))

答案 1 :(得分:2)

请勿使用“否则”。每个复选框应单独位于“ if .... end if”中。

Textbox1.Text = ""
FinalText = ""

If checkbox1.checked = true then
     FinalText = text1 & vbCrLf
End If
If checkbox2.checked = true then
     FinalText = FinalText & text2 & vbCrLf
End If
...

Textbox1.Text = FinalText

答案 2 :(得分:1)

另一种方法可以处理任意数量的CheckBoxes作为源,并且可以处理任何种类的Control作为输出(前提是Output Control具有Text属性)。

构建用于编写输出文本的字符串列表。

声明:

Private ChechBoxesText As List(Of String) = New List(Of String)

然后在适当时填写:
(字符串的来源可以是可以转换为{\ {1}}或以Array(Of String)查看的任何内容)

ChechBoxesText.AddRange({"Text1", "Text2", "Text3", "Text4", "Text5"})

为所有CheckedChanged的{​​{1}}事件添加一个公共处理程序:

CheckBoxes

注意:
For Each ctl As CheckBox In Controls.OfType(Of CheckBox).ToList AddHandler ctl.CheckedChanged, AddressOf CheckBoxes_CheckedChanged Next 控件也可以位于另一个容器内(CheckBoxGroupBox等)。在这种情况下,考虑的集合将是(当容器是Panel时):

GroupBox

定义处理程序,该处理程序将调用一个函数,该函数指定将接收输出的控件:
这里是Controls("GroupBox1").Controls.OfType(Of CheckBox) 控件,但也可以是TextBoxRichTextBoxLabel(...)。

Button

所使用的 Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) RebuilText(TextBox1) End Sub Private Sub RebuilText(OutPut As Control) OutPut.Text = String.Join(Environment.NewLine, Controls.OfType(Of CheckBox). Where(Function(c) c.Checked = True). OrderBy(Function(c) c.Name.Length). ThenBy(Function(c) c.Name). Select(Function(c) ChechBoxesText(CInt(c.Name.Substring("CheckBox".Length)) - 1))) End Sub 方法的说明:

使用LINQ类型的当前窗体的控件集合作为源:

CheckBox

Where()过滤集合,只考虑当前为Controls.OfType(Of CheckBox) 的类型CheckBox的控件:

Checked

Where(Function(c) c.Checked = True) 是源Collection的元素之一。在这种情况下,是c控件。

OrderBy()首先按CheckBox,然后按Control.Name.Length字符串对集合进行排序。
这将按照控件的名称和结尾编号(Control.Name 1 CheckBox 2 CheckBox 11 )。
如果我们不按CheckBox进行排序,则Name.Lenght 11 将按排序顺序显示在CheckBox 2 之前。

CheckBox

Select() transformation 方法。它允许返回不同的类型或值。
在这种情况下,它将返回OrderBy(Function(c) c.Name.Length). ThenBy(Function(c) c.Name). ChechBoxesText中包含的字符串。
List(Of String)位置是从List(Index)尾随数字中提取出来的,并转换为CheckBox.Name

Integer

在这里, Select(Function(c) ChechBoxesText(CInt(c.Name.Substring("CheckBox".Length)) - 1))) 方法将从Substring(StartIndex)返回一个新的String,从CheckBox.Name位置到"CheckBox".Length

您还可以使用 CheckBox.Name.Length 属性将相关文本的索引存储在CheckBox.Tag列表中。
在这种情况下,ChechBoxesText方法将是:

Select()