设置.aspx页面中复合控件中子项的属性

时间:2011-02-28 16:49:00

标签: c# asp.net controls composite

我有一个复合控件(class)通过get属性公开asp:Label是否可以通过aspx代码设置Label的Text属性?

我想做这样的事情: <cfw:MyCompositeControl runat="server" Label.Text="Test" />

一种解决方案是将每个属性添加到复合类(如公共LabelText),但我想设置任何子控件的任何属性。因此,随着子控件的新功能变得可用,我希望能够在我的复合控件上使用它们。所以基本上我想设置暴露的子控件的任何属性

3 个答案:

答案 0 :(得分:1)

您可以使用内部属性来执行此操作:

[ParseChildren(ChildrenAsProperties = true)]
public partial class MyControl: UserControl
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public TestClass TestLabel
    {
         get;set;
    }
}
public class TestClass
{
    public string Field1
    { get; set; }
    public string Field2
    { get; set; }
}

标记:

<MyTag:MyControl runat="server">
    <TestLabel Field1="a" Field2="b" />
</MyTag:MyControl>

我之前从未使用过简单的属性实际执行此操作 - 通常,您正在使用集合。在我自己玩这个例子的过程中,在标记窗口中,Visual Studio允许你在TestLabel内创建<MyTag:MyControl>的多个实例 - 也就是说,它似乎并不关心它是什么一个简单的属性而不是一个集合,我怀疑如果你输入多个条目只会导致最后一个条目。

仅供参考...如果您之前没有这样做,请准备好被intellisense惹恼。在对类进行更改后更新行为可能会令人讨厌,您需要重新编译,并且可能需要等待一段任意时间才能按照预期的方式运行。

答案 1 :(得分:0)

您需要将它作为复合控件类中的属性公开: -

public string LabelText
{
  get
  {
    return Label.Text;
  }
  set
  {
    Label.Text = value;
  }
}

然后您可以从服务器标签控制它,如: -

<cfw:MyCompositeControl runat="server" LabelText="Test" />

答案 2 :(得分:0)

您应该公开一个返回/设置Label的Text属性的公共属性。 MSDN

修改: 您不建议从页面访问复合控件的所有子控件:

  • 一种方法是通过MyCompositeControl.FindControl(ID)(或扩展方法)访问子控件,如果要删除控件或更改ID,那么非常静态且容易出错。
  • 另一种方法是让子控件公开,但这也是糟糕的设计,因为它打开了滥用控件的大门,如果你想改变子控件并且页面已经直接访问它们,那么也会有问题。