从列表框中创建一个字符串

时间:2014-10-12 19:17:16

标签: vb.net for-loop listbox

我有2个项目,其中一个存储了高分数列表,另一个尝试将高分数添加到该列表并检索列表中的所有项目。尝试将项目放在列表上运行良好,但检索列表并不能很好地工作。这是代码:

Option Strict On
Option Explicit On

Imports System.Net.Sockets
Imports System.Threading

Public Class Main

Dim server As New TcpListener(45888)
Dim client As New TcpClient
Dim stream As NetworkStream
Dim connected As Boolean

Private Sub cmd_start_Click(sender As Object, e As EventArgs) Handles cmd_start.Click
    server.Start()
    cmd_start.Enabled = False
    cmd_stop.Enabled = True
    lbl_status.Text = "Running"
    lbl_status.ForeColor = Color.Green
    tmr.Start()
End Sub

Private Sub cmd_stop_Click(sender As Object, e As EventArgs) Handles cmd_stop.Click
    server.Stop()
    cmd_start.Enabled = True
    cmd_stop.Enabled = False
    lbl_status.Text = "Not running"
    lbl_status.ForeColor = Color.Red
    tmr.Stop()
End Sub

Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    connected = False
    CheckForIllegalCrossThreadCalls = False
End Sub

Dim x As Integer = 0

Private Sub tmr_Tick(sender As Object, e As EventArgs) Handles tmr.Tick
    If server.Pending Then
        client = server.AcceptTcpClient()
        stream = client.GetStream()
        tmr.Stop()
        read()
    Else
        tmr.Start()
    End If
    lbl_mseconds.Text = "Relative time: " & x
    x += 1
End Sub

Private Sub SendMessage(message As String)
    Dim sendtext() As Byte = System.Text.Encoding.ASCII.GetBytes(message)
    stream.Write(sendtext, 0, sendtext.Length)
    stream.Flush()
End Sub

Private Sub read()
    Dim rec(client.ReceiveBufferSize) As Byte
    stream.Read(rec, 0, client.ReceiveBufferSize)
    Dim rectext As String = System.Text.Encoding.ASCII.GetString(rec)
    If rectext.Contains("@1@") Then
        rectext = rectext.Substring(3)
        If rectext.Split(CChar("-"))(0).Length = 2 Then rectext = "0" & rectext
        If rectext.Split(CChar("-"))(0).Length = 1 Then rectext = "00" & rectext
        listbox_highscores.Items.Add(rectext)
    ElseIf rectext.Contains("@2@") Then
        Dim tosend As String = listbox_highscores.Items(0).ToString
        For i = 1 To listbox_highscores.Items.Count - 1
            tosend &= "," & listbox_highscores.Items(i).ToString
        Next
        MsgBox(tosend)
        SendMessage(tosend)
    End If
    tmr.Start()
End Sub
End Class

在另一个项目中我有这个:

Dim server As New TcpListener(45888)
Dim client As New TcpClient
Dim stream As NetworkStream

Friend Sub sendHighscore(name As String, score As Integer)
    Try
        client.Connect("192.168.1.127", 45888)
    Catch ex As Exception
        Exit Sub
    End Try
    stream = client.GetStream()
    Dim sendtext() As Byte = Encoding.ASCII.GetBytes("@1@" & score & "-" & name)
    stream.Write(sendtext, 0, sendtext.Length)
    client = New TcpClient
End Sub

Friend Sub getHighscoreList()
    ListBox_highscores.Items.Clear()
    Try
        client.Connect("192.168.1.127", 45888)
    Catch ex As Exception
        ListBox_highscores.Items.Add("Couldn't connect")
        Exit Sub
    End Try
    stream = client.GetStream()
    Dim sendtext() As Byte = Encoding.ASCII.GetBytes("@2@")
    stream.Write(sendtext, 0, sendtext.Length)
    client = New TcpClient
    read()
End Sub

Private Sub read()
    Dim rec(client.ReceiveBufferSize) As Byte
    stream.Read(rec, 0, client.ReceiveBufferSize)
    Dim rectext As String = Encoding.ASCII.GetString(rec)
    Label2.Text = rectext
    For Each item In rectext.Split(",")
        ListBox_highscores.Items.Add(item)
    Next
End Sub

然后,当我使用带有名称和分数的sub sendHighscore()时,一切都完美有效,它显示在列表中的另一个项目中,但是当我使用sub getHighscoreList()时,第二个项目上的列表只包含第一个列表中的第一个项目。有人有想法吗?

2 个答案:

答案 0 :(得分:0)

编辑:完全删除原始答案,因为它实际上并不是问题(虽然它确实提供了改进)。无论如何,我的回答几乎与this one相同。

在更仔细地分析这个项目之后,For..Next循环没有返回预期结果的问题是因为字符串在缓冲区中作为字节数组来回发送,远大于必要(client.ReceiveBufferSize )。收到的实际“字符串”包含大量添加到末尾的不可打印字符(垃圾)以填充缓冲区。快速而肮脏的解决方案是删除所有不可打印的字符:

rectext = System.Text.RegularExpressions.Regex.Replace(rectext, _
    "[^\u0020-\u007F]", String.Empty)

整个Sub会这样读:

Private Sub read()
    Dim rec(client.ReceiveBufferSize) As Byte
    stream.Read(rec, 0, client.ReceiveBufferSize)
    Dim rectext As String = System.Text.Encoding.ASCII.GetString(rec)
    If rectext.Contains("@1@") Then
        rectext = rectext.Substring(3)
        If rectext.Split(CChar("-"))(0).Length = 2 Then rectext = "0" & rectext
        If rectext.Split(CChar("-"))(0).Length = 1 Then rectext = "00" & rectext
        rectext = System.Text.RegularExpressions.Regex.Replace(rectext, "[^\u0020-\u007F]", String.Empty)
        listbox_highscores.Items.Add(rectext)
    ElseIf rectext.Contains("@2@") Then
        Dim tosend As String = listbox_highscores.Items(0).ToString
        For i As Integer = 1 To (listbox_highscores.Items.Count - 1)
            tosend &= "," & listbox_highscores.Items(i).ToString
        Next
        SendMessage(tosend)
    End If
    tmr.Start()
End Sub

答案 1 :(得分:0)

试试这个,你的逗号也关闭了......

  Dim tosend As String = String.Empty
    Dim intCount As Integer = 0

    For i As Integer = 0 To listbox.Items.Count - 1
        If intCount >= 1 Then
            tosend &= "," & listbox.Items(i).ToString
        Else
            tosend &= listbox.Items(i).ToString
            intCount += 1
        End If

    Next

    MessageBox.Show(tosend)

它工作的截图!

enter image description here