[英]VB.Net Read multi column text file and load into ListBox
首先,我不是程序员,我主要是做简单的脚本,但是在VB中有些事情更容易做,我几乎是自学的,所以请原谅我,如果这听起来很基础或者我不能很好地解释它。
我在尝试将多列文本文件加载到列表框中时遇到问题。 有两个独立的问题。
第一个问题是读取文本文件,并且仅抓住列表框中要使用的第一列,我目前正在使用ReadAllLines首先将文本文件复制到字符串中。
Dim RDPItems() As String = IO.File.ReadAllLines(MyDocsDir & "\RDPservers.txt")
但是,我很难找到正确的代码以仅将该字符串的第一列放入列表框中,如果我使用split选项,则会收到一个错误,提示“类型为“字符串的一维数组”的值不能转换为“字符串””
代码看起来像
frmRDP.lstRDP.Items.Add() = Split(RDPItems, ";", CompareMethod.Text)
这是第一个障碍,第二个问题是我想要做的是,如果从“列表”框中选择了一项,则第二列的值将被拉入一个变量中以供使用。
我什至不知道从哪里开始。
文本文件的示例数据
- 服务器1; 10.1.1.1:3389
- 服务器2; 192.168.1.1:8080
- Server3; 172.16.0.1:9833
- .....
工作时,应用程序将读取包含服务器及其IP列表的文本文件,并将服务器放入列表框中,当您从列表框中选择服务器并单击连接按钮后,它将启动
c:\windows\system32\mstsc.exe /v:serverip
任何帮助将不胜感激,因为我可以将其中很大的列表硬编码到VB应用程序中,因此,只包含一个带有服务器和IP列表的文本文件会更容易加载。
最好的做法可能是将“列”存储在Dictionary中 。 在类级别(即,在任何Sub
或Function
)声明它:
Dim Servers As New Dictionary(Of String, String)
加载项目时,您逐行读取文件,将这些项目同时添加到Dictionary和ListBox中:
Using Reader As New IO.StreamReader(IO.Path.Combine(MyDocsDir, "RDPservers.txt")) 'Open the file.
While Reader.EndOfStream = False 'Loop until the StreamReader has read the whole file.
Dim Line As String = Reader.ReadLine() 'Read a line.
Dim LineParts() As String = Line.Split(New String() {" ; "}, StringSplitOptions.None) 'Split the line into two parts.
Servers.Add(LineParts(0), LineParts(1)) 'Add them to the Dictionary. LineParts(0) is the name, LineParts(1) is the IP-address.
lstRDP.Items.Add(LineParts(0)) 'Add the name to the ListBox.
End While
End Using 'Dispose the StreamReader.
(请注意,我使用IO.Path.Combine()
而不是简单地连接字符串。我建议使用IO.Path.Combine()
代替将路径连接在一起)
现在,只要您想从所选项目中获取IP地址,就可以例如进行以下操作:
Dim IP As String = Servers(lstRDP.SelectedItem.ToString())
希望这可以帮助!
编辑:
错过了您想要启动它的过程……但是就像charliefox2
写道:
Process.Start("c:\windows\system32\mstsc.exe", "/v:" & Servers(lstRDP.SelectedItem.ToString()))
编辑:文森特@Visual的答案是这样干净。 我将离开我,但我建议改用他的解决方案。 也就是说,向下滚动一点以了解如何打开服务器。 他也有! 支持他的答案,并将其标记为正确!
看来您正在尝试分割阵列。 另外, ListBox.Items.Add()
工作方式与编写代码的方式略有不同。 让我们来看看。
ListBox.Items.Add()
要求您在parameters中为其提供字符串。 因此,您可以这样做:
frmRDP.lstRDP.Items.Add(Split(RDPItems, ";", CompareMethod.Text))
但是不要那样做!
调用Split()
,必须为它提供一个字符串,而不是数组。 在这种情况下, RDPItems
是一个数组,因此我们无法一次拆分整个对象。 这是您所得到的错误的来源。 相反,我们必须一次完成一项。 为此,我们可以使用For Each
循环。 如果您不熟悉此概念,请参见此处以获取更多信息。
For Each
循环将为集合中的每个项目执行一个代码块。 使用这个,我们得到:
For Each item In RDPItems
Dim splitline() As String = Split(item, ";") 'splits the item by semicolon, and puts each portion into the array
frmRDP.lstRDP.Items.Add(splitline(0)) 'adds the first item in the array
Next
好的,这样我们就可以将服务器列表放到ListBox中。 但是现在,我们要打开用户选择的服务器。 为此,我们需要一个事件处理程序(要知道用户何时双击某事),我们必须找出他们选择的服务器,然后再打开该服务器。
首先,通过创建一个子处理该双击来处理双击:
Private Sub lstRDP_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles lstRDP.MouseDoubleClick
接下来,我们将获得用户选择的内容。 在这里,我们将选择设置为等于用户选择的索引(在这种情况下,第一项为0,第二项为1,依此类推)。
Dim selection As Integer = lstRDP.SelectedIndex
最后,我们需要打开服务器。 我假设您想在Windows资源管理器中执行此操作,但是如果我记错了,请告诉我。
Dim splitline() As String = Split(RDPItems(selection), ";")
Dim location As String = Trim(splitline(1))
我们将需要再次分割字符串,但是您会注意到,这次我选择的是其在数组中的位置与用户选择的列表框的索引相同的项目。 由于我们将项目按添加到数组的顺序添加到列表框中,因此列表框中的第一个项目将是数组中的第一个,依此类推。 服务器的位置将是split函数的第二部分,即splitline(1)
。 我还包括了Trim()
函数,该函数将删除所有前导或尾随空格。
最后,我们需要连接到服务器。 我们将使用Process.Start()
启动该过程。
Process.Start("c:\windows\system32\mstsc.exe", "/v:" & location)
为了将来参考, Process.Start()
第一个参数是进程的位置,第二个参数是该进程可能采用的任何参数(在这种情况下,指的是连接的对象)。
我们最终的双击事件处理程序如下所示:
Private Sub lstRDP_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles lstRDP.MouseDoubleClick
Dim selection As Integer = lstRDP.SelectedIndex
Dim splitline() As String = Split(RDPItems(selection), ";")
Dim location As String = Trim(splitline(1))
Process.Start("c:\windows\system32\mstsc.exe", "/v:" & location)
End Sub
最后一点:您可能需要输入
Dim RDPItems() As String = IO.File.ReadAllLines(MyDocsDir & "\RDPservers.txt")
在子类的外部,而是在您的班级内部。 这将确保单击处理程序和填充列表框的其他子控件都可以从中读取信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.