我没有找到解决问题的方法,可能是因为我无法正确表达自己真正想做的事情。
基本上,我有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 }}还是有一种方法可以自动在新行中添加我需要的文本?
答案 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
控件也可以位于另一个容器内(CheckBox
,GroupBox
等)。在这种情况下,考虑的集合将是(当容器是Panel
时):
GroupBox
定义处理程序,该处理程序将调用一个函数,该函数指定将接收输出的控件:
这里是Controls("GroupBox1").Controls.OfType(Of CheckBox)
控件,但也可以是TextBox
,RichTextBox
,Label
(...)。
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()