[英]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.