【问题标题】:Populate CheckBoxList inside Datalist ItemTemplate from database SQL Server 2012 asp.net C#从数据库 SQL Server 2012 asp.net C# 在 Datalist ItemTemplate 中填充 CheckBoxList
【发布时间】:2016-04-16 10:08:18
【问题描述】:

我在数据库 MS SQL Server 2012 中有一张疾病表。 disease_id int 疾病名称 varchar(100)。 我想要的是从 db 填充复选框列表。 我的文件 .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());

【问题讨论】:

    标签: c# asp.net sql-server checkboxlist datalist


    【解决方案1】:

    尝试使用

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

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

    同时检查checklist 是否为空。如果是这种情况,您应该使用可以在 StackOverflow 上轻松找到的递归 FindControl 方法

    【讨论】:

    • 对不起,我想我误解了这个问题。您在哪里调用 PopulateDiseases 以及如何对 DataList1 进行 DataBind?
    【解决方案2】:

    为了找到 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被填充后调用。

    另一种方法是在 DataList 的 ItemDataBound 事件处理程序中填充每个 CheckBoxList。在这种情况下,可以在事件处理程序之外声明和填充疾病表 (dt),以避免多次调用数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2013-06-24
      相关资源
      最近更新 更多