2017-03-03 11 views
0

Active Directoryから取得したデータからグリッドを読み込もうとしています。私は以下のようにGridViewを設定しました。問題は、私はその後、私はこの動的にロードするGridviewが表示されず、データが表示されない

SetInitialRow(); 
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
DataRow drCurrentRow = null; 
ように私のDataTableを宣言するアクティブデータ

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(); 
    } 

を収集する前に、以下の機能を実行するレコードが作成されているが、データが

<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> 

を示していないです

次に、アクティブデータレコードをループします。

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; 
} 
それが今であるので、私はそれが動作しますが、すべてのレコードが表示されるが、データがないこの

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

のように0と私を交換する場合は

それは、最初のループでクラッシュします。デバッグ時にempNo.textなどのコードを実行すると、すべて値を持つので、何が間違っていますか?

答えて

0

を私はあなたの問題はあまりにもすぐにGridView1.DataBind()を呼び出していることかもしれないと思います。 dtCurrentTableにすべての行を追加した後、GridView1.DataBind()の最後のを呼び出してみてください。

+0

ありがとうございました。あなたと他の回答者の両方が正しく、非常に役に立ちました。 – user616076

0

データテーブルに空の行を追加しています。代わりにあなたのコード

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

あなたはSetInitialRow方法でのDataTableをバインドしているのDataTableの

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; 

に行を追加するには、以下のコードを交換してください。そこにバインドしているときは、空の行が1つだけGridViewに追加されます。 あなたは、その後、LabelにキャストMyVars.NoOfADRecordsからラベルテキストを設定し、あなたが何も存在しないのGridViewのコントロールを探してみてください...すべてのユーザーを取得するためのループの後

第二のデータバインディングを行うとにそれらを追加する必要がありますDataTable。下のスニペットのようにDataTableに直接値を追加する方がよいでしょう。

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; 

しかし、あなたは、不要なコードの多くを取り除きたいこと、ちょうどこの操作を行います。

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

<ItemTemplate> 
    <%# Eval("EmployeeNo") %> 
</ItemTemplate> 
関連する問題