我正在为DropDownList创建一个复合控件(它还包含一个Label)。
我的想法是,我可以像下拉列表一样使用我的控件,但也可以将标签扔到DDL前面的页面上。
我对TextBoxes的工作非常有效,但由于Collection(或Datasource)组件填充DDL,我正在努力使用DDL。
基本上我希望能够做到这样的事情:
<ecc:MyDropDownList ID="AnimalType" runat="server" LabelText="this is what will be in the label">
<asp:ListItem Text="dog" Value="dog" />
<asp:ListItem Text="cat" Value="cat" />
</ecc:MyDropDownList>
问题是,我没有为我的控件扩展DropDownList类,所以我不能简单地使用那个魔法。我需要一些指针来弄清楚如何将我的控件(MyDropDownList)(目前只是System.Web.UI.UserControl
)变成可以接受标签内的List项的东西,理想情况下,我希望能够插入它是一个数据源(与常规DDL提供的功能相同)。
我试着没有运气只是扩展常规DDL,但无法让Label
组件随之飞行。
答案 0 :(得分:1)
经过一些挖掘和搜索后,我找到了一个有效的解决方案。希望这将有助于其他人在未来:
[ParseChildren(true, "Items")]
public class EDropDownList : CompositeControl, IValidatedFields
{
public string PromptingText { get; set; }
public string Value { get; set; }
public Label __Label { get; set; }
private ListItemCollection _items;
public DropDownList __DropDownList;
public ListItemCollection Items
{
get { return _items; }
set
{
if (_items != value)
{
_items = value;
}
}
}
public string Type { get { return "DropDownList"; } }
public EDropDownList()
{
__Label = new Label();
}
protected override void CreateChildControls()
{
__DropDownList = new DropDownList();
foreach (ListItem myItem in _items)
{
__DropDownList.Items.Add(myItem);
}
Controls.AddAt(0, __Label);
Controls.AddAt(1, __DropDownList);
}
protected override void OnLoad(EventArgs e)
{
// label section
__Label.Text = PromptingText+"<br />";
__Label.ForeColor = Color.Red;
__Label.Visible = false;
// ddl section
if (Page.IsPostBack)
Value = __DropDownList.SelectedValue;
}
}
答案 1 :(得分:0)
最简单的方法是回到扩展DropDownList控件的原始选项。你有什么问题让标签与它一起使用?那些问题可能更容易解决?