在每个asp:DropDownList控件代码后面添加DIV

时间:2013-11-22 13:15:05

标签: c# asp.net html controls wrapper

我尝试在全局级别(如果可能)的每个类型<asp:DropDownList>的控件周围添加一个div包装器。在这一点上,我用一个asp皮肤解决了它,为所有<asp:DropDownList>添加了“default-select”类,然后jquery只为每个类添加一个div。

$j(".default-select").wrap("<div class='myClass'></div>");

现在,我的问题。是否可以从代码隐藏中添加此div包装器而不是依赖于javascript。

控制适配器: 我知道这应该可以通过编写覆盖<asp:DropDownList> render方法的控件适配器来实现(如下所述:Dropdownlist control with <optgroup>s for asp.net (webforms)?)。但是,我只想添加一个包装div,而不是重写<asp:DropDownList>控件的整个渲染(如果我覆盖该方法,我必须这样做)。有什么建议?也许有一种方法可以在现有的适配器上添加一些东西吗?

自定义用户控制:另一种解决方案是使用换行构建自定义<mycustom:DropDownList>,但这会强制我通过整个<asp:DropDownList>替换每个实例项目(大项目)。我宁愿只更改原始控件,以便我的样式适用于任何地方。

所以摘要:是否可以轻松地将所有<asp:DropDownList>呈现为:

<div class="myClass">
      <select><option...></select>
</div>

而不只是:

<select><option...></select>

我的第一次尝试(在页面加载时):我试图在Page_load方法中添加此代码但是我找不到任何方法来渲染该div?

    var j = 0;
    foreach (DropDownList control in Page.Controls.OfType<DropDownList>())
    {

       HtmlGenericControl div = new HtmlGenericControl();
        div.ID = "div" +j;
        div.TagName = "div";
        div.Attributes["class"] = "myClass";
        div.Controls.Add(control); // or control.Controls.Add(div); but this wouldn't wrap it.
        j++;
    }

2 个答案:

答案 0 :(得分:1)

你的解决方案只是有效。服务器控件只能存在于服务器表单的范围内,您需要在页面上执行递归搜索或直接查看表单控件集合。一旦你有了DropDownList并将它包装在div容器周围,就需要将它添加到控件集合中。

另外,我认为最好在OnPreInit中执行此操作。

protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);

var j = 0;
foreach (DropDownList control in form1.Controls.OfType<DropDownList>().ToList())
{
    var div = new HtmlGenericControl();
    div.ID = "div" + j;
    div.TagName = "div";
    div.Attributes["class"] = "myClass";
    div.Controls.Add(control); // or control.Controls.Add(div); but this wouldn't wrap it.
    j++;

    form1.Controls.Add(div);
}

}

我希望这会有所帮助。让我知道你是怎么过的。

答案 1 :(得分:0)

无论哪种方式,您想要的都是自定义的,您必须为其编写代码。所以IMO,最好和最简单的选择是自定义控件。您可能需要花一些时间来重构引用以替换<asp:DropDownList>,但是在您尝试其他方式的所有时间内,您可能已经完成了。 :)

我已经学会了保持简单通常是最好的方法。