Visual Studio 在Visual Basic .NET中,如何在将多行文本框移动到另一个多行文本框时自动从该文本框中删除行

xxe27gdn  于 2022-12-14  发布在  .NET
关注(0)|答案(3)|浏览(200)

我有两个多行文本框; txtInputList和txtComplete。我可以手动将一行从txtInputList移动到txtComplete,同时从txtInputList中删除该行作为所需的结果。但是,我很难对每一行自动执行此操作。下面是手动单击每一行的按钮的方法:

Private Sub btnProcessItems_Click(sender As Object, e As EventArgs) Handles btnProcessItems.Click
    Dim strText() As String
    strText = Split(txtInputList.Text, vbCrLf)
    txtInputList.Text = String.Join(vbCrLf, strText, 1, strText.Length - 1)
    txtComplete.AppendText(strText(0) + vbCrLf)
End Sub

我试过一个For循环,但是我不能让它工作。

Private Sub btnProcessItems_Click(sender As Object, e As EventArgs) Handles btnProcessItems.Click
    Dim strText() As String
    strText = Split(txtInputList.Text, vbCrLf)
    For x As Integer = 0 to strText.Length
        txtInputList.Text = String.Join(vbCrLf, strText, 1, strText.Length - 1)
        txtComplete.AppendText(strText(0) + vbCrLf)
    Next
End Sub

有人能帮忙吗?谢谢!

5kgi1eie

5kgi1eie1#

不要将数据保存在UI中。使用数据结构保存数据,这样你就可以直接操作它(脱离UI线程),然后用数据的状态更新UI。如果你的数据只是一个字符串列表,那么使用List(Of String),或者如果它不仅仅是字符串,那么使用List(Of someClass)
我的回答将为您解决一些问题。
1.将数据保留在列表中
1.在UI线程外处理数据
1.使用Async/Await以确保没有UI阻塞
首先,一个保存数据的类。你可以选择一个漂亮的名字来显示,以及一个URL或任何你想在处理器中使用的其他属性

Public Class Data
    Public Property Name As String
    Public Property Url As String
    Public Sub New(name As String)
        Me.Name = name
    End Sub
    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class

创建输入项和完整项的列表,我将使用10个项初始化输入,字母为A... J。还定义一个方法,将这两个列表放入TextBox中

Private inputs As List(Of Data)
Private completes As List(Of Data)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' initialize our fake data
    inputs = Enumerable.Range(65, 10).Select(Function(i) New Data(New String({Chr(i)}))).ToList()
    completes = New List(Of Data)()
    bindTextBoxes()
End Sub

Private Sub bindTextBoxes()
    txtInputList.Text = String.Join(Environment.NewLine, inputs)
    txtComplete.Text = String.Join(Environment.NewLine, completes)
End Sub

添加一个Async按钮处理程序来处理所有项目,添加Task函数来处理每个项目。按钮处理程序不处理任何内容,而是在Awaited任务中处理。处理完每个项目后,重新绑定TextBox以更新UI。

Private Async Sub btnProcessItems_Click(sender As Object, e As EventArgs) Handles btnProcessItems.Click
    While inputs.Any()
        Await processFirstItem()
        bindTextBoxes()
    End While
End Sub

Private Function processFirstItem() As Task
    Return Task.Run(
        Sub()
            Dim item = inputs.First()
            inputs.RemoveAt(0)
            processItem(item)
            completes.Add(item)
        End Sub)
End Function

Private Sub processItem(item As Data)
    ' do whatever you need to do on the item, emulate a delay with thread sleep
    Threading.Thread.Sleep(250) ' remove this in production
End Sub

如果您尝试使用这段代码,您可能会注意到它是在UI之外运行的,因此您的应用程序可以顺利运行。您只是在数据结构而不是UI上操作。这是一种很好的方法来完成您要做的事情。

如果您的处理可以并行完成,那么您应该研究一下Task Parallel Library,根据所使用的资源,您的工作可能会执行得更快。

8yoxcaq7

8yoxcaq72#

尝试此操作,您需要更改文本框的名称。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim sb As New System.Text.StringBuilder
    For Each line As String In TextBox1.Lines
        sb.AppendLine(line)
    Next
    TextBox1.Clear()
    TextBox2.Text = sb.ToString
End Sub
nnvyjq4y

nnvyjq4y3#

我完全同意djv的回答,但这里有一种直接使用UI的方法:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If TextBox1.Text.Trim.Length = 0 Then
        Exit Sub
    End If

    Button1.Enabled = False
    TextBox1.Enabled = False
    TextBox2.Enabled = False
    TextBox2.Clear()

    Dim lines As New List(Of String)(TextBox1.Lines)
    Dim processed As New List(Of String)
    While (lines.Count > 0)
        Dim current As String = lines(0)
        lines.RemoveAt(0)
        TextBox1.Lines = lines.ToArray

        ' ... do something with "current" ...
        Label1.Text = "Processing: " & current
        Await Task.Delay(2000)

        processed.Add(current)
        TextBox2.Lines = processed.ToArray
    End While
    Label1.Text = ""

    TextBox1.Enabled = True
    TextBox2.Enabled = True
    Button1.Enabled = True
End Sub

以下是它的实际应用:

相关问题