我的表单中有两个 TextBoxes
,其中 Multiline
已启用且 Button
。让我们说 tB1
和 tB2
。 tB1
和 tB2
包含组号, Button
点击事件会删除所有字符串(数字)来自 tB1
上的 tB2
。但由于所有数字都被 NewLine
分隔,因此通过与另一个字符串匹配来替换字符串会导致很多空行。
示例 - tB1
值:
1
2
3
4
5
6
7
8
9
10
示例 - tB2
值:
3
7
8
我得到的是什么:
1
2
[空行]
4
5
6
[空行]
[空行]
9
10
我想要的是:
1
2
4
5
6
9
10
我正在使用代码:
Dim strFix() as String
Private Sub Button1_Click() Handles Button1.Click
strFix = Split(tB2.Text, vbNewLine)
For Each str1 as String In strFix
tb1.Text= tb1.Text.Replace(str1, "")
Next
End Sub
注意:使用.Trim()没有解决这个问题,因为它只删除了最后一个空行或空格。
答案 0 :(得分:3)
String.Replace
无法删除这些行。您必须创建一个新的行列表,而不包含出现在Tb2中的行列表。
您可以使用TextBox.Lines
获取所有行的数组。 LINQ简化了任务:
Dim onlyInTb1 = tB1.Lines.Except(tB2.Lines)
tB1.Lines = onlyInTb1.ToArray()
经典的非LINQ方式是使用List(Of String)
:
Dim onlyInTb1List As New List(Of String)
Dim tb2Lines = tb2.Lines
For Each tb1Line In tB1.Lines
If Not tb2Lines.Contains(tb1Line)
onlyInTb1List.Add(tb1Line)
End If
Next
tb1.Lines = onlyInTb1List.ToArray()
最后一种方法没有textBox.Lines
- “技巧”与String.Split
和String.Join
:
Dim tb1Lines = tB1.Text.Split({Environment.NewLine}, StringSplitOptions.None)
Dim tb2Lines = tB2.Text.Split({Environment.NewLine}, StringSplitOptions.None)
Dim onlyInTb1 = tb1Lines.Except( tb2Lines )
tB1.Text = String.Join(Environment.NewLine, onlyInTb1)
答案 1 :(得分:0)
我找到了一个适合我的解决方案。
Dim strFix() As String
Private Sub FixBlankLines ()
strFix = Split(tB2.Text, vbNewLine)
For Each str1 as String In strFix
tb1.Text= tb1.Text.Replace(str1, "")
Next
strFix = Split(tb1.Text, vbNewLine)
tb1.Text = ""
For Each str2 As String In strFix
If str2 <> "" Then
tb1.Text += Val(str2).ToString("00000") + vbNewLine
End If
Next
tb1.Text = tb1.Text.Trim
End Sub
答案 2 :(得分:0)
我认为这是因为For Each循环而发生的。每次循环一个项目时,它都会“加倍”这段代码。
答案 3 :(得分:0)
txtResult.Lines = txtSource.Lines.Where(Function(line) line.Trim() <> String.Empty).ToArray()