2014-10-28 326 views
2

我编写了下面的程序来查找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 

回答

2

你真不该使用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 
+0

你是男人!第一个选项工作,因为我会有字符串在那里。你能告诉我如何制作2列标题,并把项目返回在那里?基本上我想要的是这样的:用户名会从第一个列表框中取出 用户名电子邮件地址 johndoe [email protected] – 2014-10-28 17:58:44

+0

对于两列,我建议使用一个ListView控件,将View属性设置为' Details'。但是,DataGridView控件是另一种流行的选择。 – 2014-10-28 18:01:44

+0

这里是[另一篇文章](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