我尝试在全局级别(如果可能)的每个类型<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++;
}
答案 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>
,但是在您尝试其他方式的所有时间内,您可能已经完成了。 :)
我已经学会了保持简单通常是最好的方法。