2014-10-28 328 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