2016-04-16 59 views
0

我在數據庫MS SQL Server 2012中有疾病表。 disease_id int disease_name varchar(100)。 我想要的是從數據庫中填充checkboxlist。 我的文件的.aspx部分是:從數據庫SQL Server 2012中填充數據源ItemTemplate中的CheckBoxList asp.net C#

<div style="width: 100%; float: left"> 
    <br /> 
    <br /> 
    <asp:DataList ID="DataList1" runat="server" CellPadding="4" ForeColor="#333333" Width="350px"> 
     <AlternatingItemStyle BackColor="White" ForeColor="#284775" /> 
     <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <ItemStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
     <ItemTemplate> 
      <asp:CheckBoxList ID="chkbxlistDiseases" runat="server" RepeatDirection="Vertical" AutoPostBack="true" DataTextField='<%#Eval("disease_name") %>' DataValueField='<%#Eval("disease_name")%>'> 
      </asp:CheckBoxList> 
     </ItemTemplate> 
     <SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
    </asp:DataList> 
</div> 

和我的文件的.cs部分是:

void PopulateDiseases() 
{ 
    SqlConnection con = new SqlConnection(str_con); 
    DataTable dt = new DataTable(); 
    SqlDataAdapter sda = new SqlDataAdapter("select disease_name from diseases", con); 
    sda.Fill(dt); 
    CheckBoxList checklist = DataList1.FindControl("chkbxlistDiseases") as CheckBoxList; 
    foreach (DataRow dr in dt.Rows) 
    { 
     checklist.Items.Add(dr["0"].ToString()); 
    } 
} 

的錯誤是:

{"Object reference not set to an instance of an object."} 

在這行代碼

checklist.Items.Add(dr["0"].ToString()); 

回答

0

嘗試使用

checklist.Items.Add(dr["disease_name"].ToString()); 

checklist.Items.Add(dr[0].ToString()); 

同時檢查checklist爲null。如果是這種情況,您應該使用遞歸的FindControl方法,您可以在StackOverflow上輕鬆找到它。

+0

我沒有使用遞歸的FindControl方法。請你幫我做這個.. –

+0

對不起,我想我誤解了這個問題。你在哪裏調用PopulateDiseases,你怎麼DataBind的DataList1? – schudel

0

爲了找到CheckBoxList,您必須在DataList的每個項目中查找它。下面的代碼顯示了你如何做到這一點。我已將字段disease_id設置爲每個複選框的值,但如果您願意,可以將其返回disease_name

的標記:

<ItemTemplate> 
    <asp:CheckBoxList ID="chkbxlistDiseases" runat="server" RepeatDirection="Vertical" AutoPostBack="true" DataTextField='disease_name' DataValueField='disease_id' /> 
</ItemTemplate> 

代碼隱藏:

void PopulateDiseases() 
{ 
    SqlConnection con = new SqlConnection(str_con); 
    DataTable dt = new DataTable(); 
    SqlDataAdapter sda = new SqlDataAdapter("select disease_id, disease_name from diseases", con); 
    sda.Fill(dt); 
    foreach (DataListItem item in DataList1.Items) 
    { 
     CheckBoxList checklist = item.FindControl("chkbxlistDiseases") as CheckBoxList; 
     checklist.DataSource = dt; 
     checklist.DataBind(); 
    } 
} 

功能DataList1已被填充後PopulateDiseases必須被調用。

另一種方法是填充DataList的ItemDataBound事件處理程序中的每個CheckBoxList。在這種情況下,疾病表(dt)可以在事件處理程序之外聲明和填充,以避免多次調用數據庫。

相關問題