2016-07-12 16 views
2

Ich verwende derzeit Visual C# mit ASP.NET-Framework, und ich versuche, eine GridView über eine DataTable zu füllen. Die Informationen werden von Active Directory abgerufen.So füllen Sie eine Gridview aus Active Directory in Visual C#

Meine gridview wie folgt erklärt wird:

<asp:GridView ID="grdvList" runat="server" AutoGenerateColumns="False" Width="567px"> 
    <Columns> 
     <asp:BoundField HeaderText="Name" ReadOnly="True" /> 
     <asp:BoundField HeaderText="Phone" ReadOnly="True" /> 
     <asp:BoundField HeaderText="Email" ReadOnly="True" /> 
    </Columns> 
</asp:GridView> 

meinen Code Und das gridview zu füllen, um zu versuchen ist die folgende:

DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["LDAP"]); 

DirectorySearcher search = new DirectorySearcher(entry) 
     { 
      SearchScope = SearchScope.Subtree, 
      Filter = "(&(objectClass=user)(physicalDeliveryOfficeName=Dartmouth))" 
     }; 

search.PropertiesToLoad.Add("sAMAccountName"); 

SearchResultCollection result = search.FindAll(); 

DataTable table = new DataTable(); 
DataRow dr = null; 

//Add columns to DataTable 
table.Columns.Add("Name", System.Type.GetType("System.String")); 
table.Columns.Add("Phone", System.Type.GetType("System.String")); 
table.Columns.Add("Email", System.Type.GetType("System.String")); 

foreach (SearchResult sr in uList) 
{ 
    dr = table.NewRow(); 

    DirectoryEntry DE = sr.GetDirectoryEntry(); 
    dr["Name"] = DE.Properties["givenName"].Value.ToString(); 
    dr["Phone"] = DE.Properties["telephoneNumber"].Value.ToString(); 
    dr["Email"] = DE.Properties["mail"].Value.ToString(); 

    table.Rows.Add(dr); 
} 

table.AcceptChanges(); 

grdvList.DataSource = table; 
grdvList.DataBind(); 

Zur Zeit, als ich es laufen, ist es ein

wirft

Objektverweis nicht auf eine Instanz eines Objektfehlers gesetzt

in dieser Zeile:

dr["Phone"] = DE.Properties["telephoneNumber"].Value.ToString(); 

Jede Hilfe ist auf jeden Fall zu schätzen!

+0

Mögliche Duplikat [Was für eine Nullreferenceexception ist, und wie kann ich es beheben?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception -und-wie-tu-ich-fix-it) –

Antwort

0

In Ihrem Szenario, könnten Sie mit Datatable und DataSet der alten Technik ist zu vermeiden. In diesen Tagen versuchen wir, sie nicht zu benutzen, es sei denn, wir haben keine andere Wahl.

Für Nullreferenceexception, wollen Sie sicherstellen, dass DE.Properties["mail"] nicht null ist, bevor seine Value bekommen.

Zum Beispiel

DirectoryEntry entry = new DirectoryEntry(ConfigurationManager.AppSettings["LDAP"]); 
DirectorySearcher search = new DirectorySearcher(entry) 
{ 
    SearchScope = SearchScope.Subtree, 
    Filter = "(&(objectClass=user)(physicalDeliveryOfficeName=Dartmouth))" 
}; 
search.PropertiesToLoad.Add("sAMAccountName"); 
SearchResultCollection result = search.FindAll(); 

var users = result.Cast<SearchResult>().Select(sr => sr.GetDirectoryEntry()) 
    .Select(de => new 
    { 
     Name = de.Properties["Name"] != null ? de.Properties["Name"].Value.ToString() : "", 
     Phone = de.Properties["Phone"] != null ? de.Properties["Phone"].Value.ToString() : "", 
     Email = de.Properties["Email"] != null ? de.Properties["Email"].Value.ToString() : "", 
    }).ToList(); 

grdvList.DataSource = users; 
grdvList.DataBind(); 
+0

Okay, das ist ein Schritt in die richtige Richtung. Der einzige Fehler in Ihrem Code ist, dass wir 'Name = de.Properties [" Name "] benötigen. Wert! = Null' anstelle von' Name = de.Properties ["Name"]! = Null'. Meine Gridview ist mit der entsprechenden Menge an Zeilen gefüllt, aber es gibt nichts in ihnen ... http://i.imgur.com/eVaodTy.png –

+0

Sie benötigen noch ** DataField ** Attribut für Boundfield. Zum Beispiel, ' – Win

+0

Das hat funktioniert! Das einzige Problem war, dass Sie im ursprünglichen Code, den Sie gepostet haben, nicht die Korrekte LDAP-Namen, zB de.properties ["mail"] Es funktioniert jetzt aber, danke! –