如何使用 ASP.NET 文字动态生成复选框列表

How to generate Checkboxlist dynamically using ASP.NET Literal

我正在尝试使用此代码动态生成复选框列表:

string IDToEdit = Request.QueryString["id"].ToString();

        List<DAL.EF.Dental_Price_Lists> lstOfCategDental = BAL.Helpers.Prices.GetDentalCategories();
        string HTMLTag = "";
        string HTMLTag2 = "";
        int count = 1;
        foreach (var x in lstOfCategDental)
        {
            HTMLTag += string.Format("<a href='#tab{0}'>{1}</a>", count, x.Category);
            List<DAL.EF.Dental_Price_Lists> priceList = BAL.Helpers.Prices.GetDentalPrices(x.Category);

            HTMLTag2 += string.Format("<div id='tab{0}' class='tab'>", count);
            HTMLTag2 += string.Format("    <asp:CheckBoxList ID='chkListDental{0}' runat='server'>", count);

            foreach (var price in priceList)
            {
                HTMLTag2 += string.Format("          <asp:ListItem Value='{0}' price='{1}' Text='{2}'></asp:ListItem>", price.ID.ToString(), price.Price.ToString(), price.Type);
            } 

            HTMLTag2 += "                  </asp:CheckBoxList>";
            HTMLTag2 += "              </div>";

            count++;
        }

        ltrCategories.Text = HTMLTag;
        ltrChkListDental.Text = HTMLTag2;
    }

但它没有正常工作 "explained in the below image",我想那是因为 ASP.NET 标签而不是 HTML 标签,但我不确定...所以,你能帮我解决这个问题吗?

正如您在下图中看到的,asp.net 标签没有转换为 html 标签?

http://i.stack.imgur.com/ufSq3.png

你做不到。但是您可以实例化一个新控件,然后将其附加到页面控件 属性:

foreach (var x in lstOfCategDental) {
    List<DAL.EF.Dental_Price_Lists> priceList = BAL.Helpers.Prices.GetDentalPrices(x.Category);
    var checkboxList = new CheckBoxList();
    checkboxList.ID = string.Format("chkListDental{0}", count);

    foreach (var price in priceList) {
        var listItem = new ListItem(price.Type);

        listItem.Value =  price.ID.ToString();
        checkboxList.Attributes.Add("price", price.Price.ToString());
        checkboxList.Items.Add(listItem);
    }

    count++;
    Page.Controls.Add(checkboxList);
}

或者每个控件都使用控件的RenderControl方法,但是不推荐。

StringBuilder sb = new StringBuilder();
StringWriter stWriter = new StringWriter(sb);
HtmlTextWriter htmlWriter = new HtmlTextWriter(stWriter);
ControlToRender.RenderControl(htmlWriter);
.
.
.

foreach (var x in lstOfCategDental) {
    List<DAL.EF.Dental_Price_Lists> priceList = BAL.Helpers.Prices.GetDentalPrices(x.Category);
    var checkboxList = new CheckBoxList();
    checkboxList.ID = string.Format("chkListDental{0}", count);

    foreach (var price in priceList) {
        var listItem = new ListItem(price.Type);

        listItem.Value =  price.ID.ToString();
        checkboxList.Attributes.Add("price", price.Price.ToString());
        checkboxList.Items.Add(listItem);
    }

    count++;
    checkboxList.RenderControl(htmlWriter);
}

ltrChkListDental.Text = sb.ToString();

我通过动态创建 div 然后将复选框列表添加到那个 div 来解决它。

string IDToEdit = Request.QueryString["id"].ToString();

        List<DAL.EF.Dental_Price_Lists> lstOfCategDental = BAL.Helpers.Prices.GetDentalCategories();
        string HTMLTag = "";
        int count = 1;

        foreach (var x in lstOfCategDental)
        {
            var checkboxList = new CheckBoxList();
            List<DAL.EF.Dental_Price_Lists> priceList = BAL.Helpers.Prices.GetDentalPrices(x.Category);

            HTMLTag += string.Format("<a href='#tab{0}'>{1}</a>", count, x.Category);
            checkboxList.ID = string.Format("chkListDental{0}", count);

            HtmlGenericControl divControl = new HtmlGenericControl("div");

            // Set the properties of the new HtmlGenericControl control.
            divControl.ID = "tab" + count;
            divControl.Attributes.Add("class", "tab"); 

            // Add the new HtmlGenericControl to the Controls collection of the
            // PlaceHolder control. 
            divPlaceHolder.Controls.Add(divControl);

            foreach (var price in priceList)
            {
                var listItem = new ListItem(price.Type);

                listItem.Value = price.ID.ToString();
                checkboxList.Attributes.Add("price", price.Price.ToString());
                checkboxList.Items.Add(listItem);
            }

            count++;
            divControl.Controls.Add(checkboxList);

        }

        ltrCategories.Text = HTMLTag;