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



我尝试在全局级别(如果可能的话(简单地在<asp:DropDownList>类型的每个控件周围添加一个div包装器。在这一点上,我已经用一个asp皮肤解决了它,为所有<asp:DropDownList>添加了"默认选择"类,然后jquery为每个添加一个div。

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

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

控制适配器:我知道这应该可以通过编写一个覆盖<asp:DropDownList>渲染方法的控制适配器来实现(如下所述:带有

s for asp.net(网络表单(的下拉列表控件?但是,我只想添加一个包装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++;
    }

您的解决方案几乎有效。服务器控件只能存在于服务器窗体的范围内,您需要在页面上执行递归搜索或直接在窗体控件集合中查找。一旦你有了 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);
}

}

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

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

我学到了艰难的方式,保持简单通常是最好的方法。

最新更新