2017-03-03 2 views
0

Ich versuche, ein Raster aus Daten aus einem Active Directory geladen. Ich habe das GridView wie folgt dargelegt. Das Problem ist, die Aufzeichnungen erstellt werden, aber die Daten werden nicht angezeigtDynamisch laden Gridview nicht angezeigt und Daten

<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false" AllowPaging="True" Visible="false" 
    BackColor="White" BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" CellPadding="4" 
    style ="z-index: 2; left: 65px; top:355px; position: absolute; height: 221px; width: 1158px"> 
    <Columns> 
     <asp:BoundField DataField="RowNumber" HeaderText="Row Number" /> 
     <asp:TemplateField HeaderText="Employee No"> 
      <ItemTemplate> 
       <asp:Label ID="EmployeeNo" runat="server" style="color:blue"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Name"> 
      <ItemTemplate> 
       <asp:Label ID="DisplayName" runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Department"> 
      <ItemTemplate> 
       <asp:Label ID="Department" runat="server"></asp:Label> 
      </ItemTemplate>   
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Job Title"> 
      <ItemTemplate> 
       <asp:Label ID="JobTitle" runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Manager"> 
      <ItemTemplate> 
       <asp:Label ID="Manager" runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Employee ID"> 
      <ItemTemplate> 
       <asp:Label ID="Name" runat="server"></asp:Label> 
      </ItemTemplate>   
     </asp:TemplateField> 
    </Columns> 
</asp:gridview> 

Ich betreibe die Funktion unten, bevor die Active Data sammeln

private void SetInitialRow() 
    { 
     DataTable dt = new DataTable(); 
     DataRow dr = null; 
     dt.Columns.Add(new DataColumn("RowNumber", typeof(string))); 
     dt.Columns.Add(new DataColumn("EmployeeNo", typeof(string))); 
     dt.Columns.Add(new DataColumn("DisplayName", typeof(string))); 
     dt.Columns.Add(new DataColumn("Department", typeof(string))); 
     dt.Columns.Add(new DataColumn("JobTitle", typeof(string))); 
     dt.Columns.Add(new DataColumn("Manager", typeof(string))); 
     dt.Columns.Add(new DataColumn("Name", typeof(string))); 
     dr = dt.NewRow(); 
     dr["RowNumber"] = 1; 
     dr["EmployeeNo"] = string.Empty; 
     dr["DisplayName"] = string.Empty; 
     dr["Department"] = string.Empty; 
     dr["JobTitle"] = string.Empty; 
     dr["Manager"] = string.Empty; 
     dr["Name"] = string.Empty; 
     dt.Rows.Add(dr); 
     //dr = dt.NewRow(); 

     //Store the DataTable in ViewState 
     ViewState["CurrentTable"] = dt; 

     Gridview1.DataSource = dt; 
     Gridview1.DataBind(); 
    } 

Dann erkläre ich meine Datatable wie diese

SetInitialRow(); 
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
DataRow drCurrentRow = null; 

Dann durchschlinge ich die aktiven Datensätze

for (int i = 0; i < MyVars.NoOfADRecords; i++) 
{ 
    Label empNo = (Label)Gridview1.Rows[i].Cells[1].FindControl("EmployeeNo"); 
    Label displayName =(Label)Gridview1.Rows[i].Cells[2].FindControl("DisplayName"); 
    Label dept =(Label)Gridview1.Rows[i].Cells[3].FindControl("Department"); 
    Label jobTitle = (Label)Gridview1.Rows[i].Cells[1].FindControl("JobTitle"); 
    Label manager = (Label)Gridview1.Rows[i].Cells[2].FindControl("Manager"); 
    Label name = (Label)Gridview1.Rows[i].Cells[3].FindControl("Name"); 

    drCurrentRow = dtCurrentTable.NewRow(); 
    drCurrentRow["RowNumber"] = i; 

    empNo.Text = MyVars.ADEmployeeID[i]; 
    displayName.Text = MyVars.ADName[i]; 
    dept.Text = MyVars.ADDepartment[i]; 
    jobTitle.Text = MyVars.ADJobtitle[i]; 
    manager.Text = MyVars.ADManager[i]; 
    name.Text = MyVars.ADName[i]; 

    dtCurrentTable.Rows[i]["EmployeeNo"] = empNo.Text; 
    dtCurrentTable.Rows[i]["DisplayName"] = displayName.Text; 
    dtCurrentTable.Rows[i]["Department"] = dept.Text; 
    dtCurrentTable.Rows[i]["JobTitle"] = jobTitle.Text; 
    dtCurrentTable.Rows[i]["Manager"] = manager.Text; 
    dtCurrentTable.Rows[i]["Name"] = name.Text; 

    dtCurrentTable.Rows.Add(drCurrentRow); 
    ViewState["CurrentTable"] = dtCurrentTable; 
} 

So wie es jetzt ist es stürzt auf der ersten Schleife, wenn ich die i mit 0 gefällt dieses

(Label)Gridview1.Rows[0].Cells[1].FindControl("EmployeeNo"); 

Es funktioniert ersetzen, aber obwohl alle Datensätze angezeigt werden keine Daten. Wenn ich den Code debugge im empt.No.text etc .. alle haben Werte, also was mache ich falsch?

Antwort

0

Ich denke, Ihr Problem sein könnte einfach, dass Sie anrufen GridView1.DataBind() zu früh . Versuchen Sie GridView1.DataBind() zuletzt aufzurufen, nachdem Sie alle Zeilen zu dtCurrentTable hinzugefügt haben.

+0

Vielen Dank Joe, sowohl Sie als auch die anderen Antworten waren korrekt und sehr hilfreich. – user616076

0

Sie fügen der Datentabelle leere Zeilen hinzu. Ersetzen Sie den Code unten hinzufügen Zeilen in Datentabelle

drCurrentRow["EmployeeNo"] = empNo.Text; 
    drCurrentRow["DisplayName"] = displayName.Text; 
    drCurrentRow["Department"] = dept.Text; 
    drCurrentRow["JobTitle"] = jobTitle.Text; 
    drCurrentRow["Manager"] = manager.Text; 
    drCurrentRow["Name"] = name.Text; 

    dtCurrentTable.Rows.Add(drCurrentRow); 
    ViewState["CurrentTable"] = dtCurrentTable; 

Statt Code

dtCurrentTable.Rows[i]["EmployeeNo"] = empNo.Text; 
     dtCurrentTable.Rows[i]["DisplayName"] = displayName.Text; 
     dtCurrentTable.Rows[i]["Department"] = dept.Text; 
     dtCurrentTable.Rows[i]["JobTitle"] = jobTitle.Text; 
     dtCurrentTable.Rows[i]["Manager"] = manager.Text; 
     dtCurrentTable.Rows[i]["Name"] = name.Text; 
dtCurrentTable.Rows.Add(drCurrentRow); 
    ViewState["CurrentTable"] = dtCurrentTable; 
0

Sie binden die Datentabelle in der SetInitialRow Methode. Wenn Sie dort binden, fügt es der GridView nur die eine leere Zeile hinzu. Sie sollten die Datenbindung nach der Schleife tun, um alle Benutzer zu erhalten ...

Zweitens versuchen Sie Steuerelemente im Gridview zu finden, wo es keine gibt, dann Label werfen, stellen Sie den Beschriftungstext aus MyVars.NoOfADRecords und fügen Sie diejenigen, die DataTable. Es ist besser, die Werte wie im folgenden Abschnitt direkt zur DataTable hinzuzufügen.

for (int i = 0; i < MyVars.NoOfADRecords; i++) 
{ 
    drCurrentRow["EmployeeNo"] = MyVars.ADEmployeeID[i]; 
    drCurrentRow["DisplayName"] = MyVars.ADName[i]; 

    dtCurrentTable.Rows.Add(drCurrentRow); 
} 

Gridview1.DataSource = dtCurrentTable; 
Gridview1.DataBind(); 
ViewState["CurrentTable"] = dtCurrentTable; 

Aber es wollen Sie loswerden eine Menge unnötigen Code zu bekommen, dies nur tun:

Gridview1.DataSource = MyVars.NoOfADRecords; 
Gridview1.DataBind(); 

<ItemTemplate> 
    <%# Eval("EmployeeNo") %> 
</ItemTemplate> 
Verwandte Themen