使用VB.NET循环遍历ListBox控件中的每个项目
问题描述:
我编写了下面的程序来查找LDAP用户并返回属性。我需要它的工作方式如下:首先我将加载一个用户ID列表到ListBox1
,然后当我点击一个按钮属性(如DisplayName)将被追加到ListBox2
。现在我必须点击ListBox1
中的一个项目,然后点击按钮并且它可以工作,但是我希望它循环遍历ListBox1
中的每个ID,并将它们的属性写入ListBox2
,而无需点击每个用户ID 。我怎样才能把下面的每个循环放在一个?使用VB.NET循环遍历ListBox控件中的每个项目
Dim de As New DirectoryEntry("LDAP://test.com/DC=test,DC=com")
Dim LdapFilter As String = "(sAMAccountName=" & ListBox1.Text & ")"
Dim searcher As New DirectorySearcher(de, LdapFilter)
Dim result As SearchResult = searcher.FindOne()
ListBox2.Items.Add(result.Properties("displayName")(0).ToString())
更新
我试图用ListView
显示两列,如建议。然而,这不起作用。它只是增加了ListView
列:
Dim item As ListViewItem = ListView1.Items.Add("Username")
Dim item1 As ListViewItem = ListView1.Items.Add("Title")
For Each i As String In ListBox1.Items
Dim de As New DirectoryEntry("LDAP://test.com/DC=test,DC=com")
Dim LdapFilter As String = "(sAMAccountName=" & i & ")"
Dim searcher As New DirectorySearcher(de, LdapFilter)
Dim result As SearchResult = searcher.FindOne()
item.SubItems.Add(result.Properties("sAMAccountName")(0).ToString())
item1.SubItems.Add(result.Properties("title")(0).ToString())
Dim ADEntry As DirectoryEntry = New DirectoryEntry(result.Path)
If result.Properties("displayName") Is Nothing Then
On Error Resume Next
End If
Next
答
你真不该使用ListBox1.Text
财产。这很混乱。在这种情况下,您需要遍历ListBox1.Items
列表中的所有字符串(假定它们实际上是字符串)。例如:
For Each i As String in ListBox1.Items
Dim de As New DirectoryEntry("LDAP://test.com/DC=test,DC=com")
Dim LdapFilter As String = "(sAMAccountName=" & i & ")"
Dim searcher As New DirectorySearcher(de, LdapFilter)
Dim result As SearchResult = searcher.FindOne()
ListBox2.Items.Add(result.Properties("displayName")(0).ToString())
Next
或者,如果ListBox1
实际上并不包含字符串,你可以通过他们环路Object
和调用ToString
方法上的每一个,就像这样:
For Each i As Object in ListBox1.Items
Dim de As New DirectoryEntry("LDAP://test.com/DC=test,DC=com")
Dim LdapFilter As String = "(sAMAccountName=" & i.ToString() & ")"
Dim searcher As New DirectorySearcher(de, LdapFilter)
Dim result As SearchResult = searcher.FindOne()
ListBox2.Items.Add(result.Properties("displayName")(0).ToString())
Next
正如我所提到在下面的评论中,而不是使用两个单独的ListBox
控件,最好使用两列的ListView
控件。举例来说,如果你有一个ListView1
控制有三列(标题为“ID”,“用户名”和“标题”),那么你可以添加的项目是这样的:
Dim userIds As IEnumerable(Of String) = getAllLdapUserIds() ' Get the list of ID's using whatever means you are currently using
For Each i As String In userIds
Dim de As New DirectoryEntry("LDAP://test.com/DC=test,DC=com")
Dim LdapFilter As String = "(sAMAccountName=" & i & ")"
Dim searcher As New DirectorySearcher(de, LdapFilter)
Dim result As SearchResult = searcher.FindOne()
Dim item As ListViewItem = ListView1.Items.Add(i)
item.SubItems.Add(result.Properties("sAMAccountName")(0).ToString())
item.SubItems.Add(result.Properties("title")(0).ToString())
Next
你是男人!第一个选项工作,因为我会有字符串在那里。你能告诉我如何制作2列标题,并把项目返回在那里?基本上我想要的是这样的:用户名会从第一个列表框中取出 用户名电子邮件地址 johndoe [email protected] – 2014-10-28 17:58:44
对于两列,我建议使用一个ListView控件,将View属性设置为' Details'。但是,DataGridView控件是另一种流行的选择。 – 2014-10-28 18:01:44
这里是[另一篇文章](http://stackoverflow.com/questions/15920322/outputting-2-lists-of-data-but-keeping-them-organised-in-vb/15926375#15926375)我在哪里展示如何在ListView控件中显示两列数据。这应该给你一个关于它是如何工作的好主意。 – 2014-10-28 18:04:54