簡體   English   中英

從數據庫SQL Server 2012 asp.net C#填充Datalist ItemTemplate內的CheckBoxList

[英]Populate CheckBoxList inside Datalist ItemTemplate from database SQL Server 2012 asp.net C#

我在數據庫MS SQL Server 2012中有一張疾病表。disease_id int disease_name varchar(100)。 我想要的是從數據庫填充復選框列表。 我的文件.aspx部分是:

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

嘗試使用

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

要么

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

還要檢查checklist是否為空。 如果是這種情況,則應使用可以在StackOverflow上輕松找到的遞歸FindControl方法

為了找到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();
    }
}

PopulateDiseases DataList1之后必須調用函數PopulateDiseases

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM