2010-07-15 184 views
1

如何在自定义web控件上动态创建一些公共属性。动态创建公共属性

例如,Web控件有5个TextBox控件。我需要每个TextBox控件的公共属性来设置TextBox控件的特定属性。

我希望能够循环webcontrol中的控件并为每个TextBox控件创建一个公共属性。

有什么想法?

+0

你可以让它们成为公共的,然后你可以从页面访问它们。 – 2010-07-15 17:47:07

回答

1

编辑:

如果孩子的控件存在于设计时,那么你需要解释为什么要动态地添加属性访问控制成员 - 除非有一个很好的理由,它只是听起来像一个糟糕的设计。

这里是我的建议:

  • 留下您的控件FriendPrivate - 不直接暴露它们(它导致紧密耦合,并随着时间的推移变得讨厌)。

  • 公开一个新的公共属性,获取/设置控件的1x上的相应属性;所以如果你想在5x TextBoxes上设置.Text,你将拥有5x属性。

  • 完成它。

如果您试图通过动态添加它们来变得聪明,那么这是一个很好的意图,会导致糟糕的结果。请记住:KISS(保持简单,愚蠢!)。

+0

在设计时出席。 – 2010-07-15 15:35:21

+0

那么为什么动态添加属性 - 只需将其相关的属性添加到类 - 在属性设置器更新相应的控制值。 – STW 2010-07-15 15:45:39

1

您可以创建这样

private TextBox[] textBoxes; //declared as a class member variable 

    public TextBox[] TextBoxes 
    { 
     get 
     { 
      if (textBoxes == null) 
      { 
       textBoxes =(from ctrl in this.Controls.OfType<Control>() 
          where ctrl is TextBox 
          select (TextBox)ctrl).ToArray(); 
      } 
      return textBoxes; 
     } 
    } 
+0

我需要能够设置值,虽然...... – 2010-07-15 15:06:42

+0

只要你不试图用这种方法设置文本框的集合,即使这个属性是只读的,你仍应该可以。你会做一些像'myControl.TextBoxes [0] .Text =“Test”;' – 2010-07-15 15:12:37

+0

这将起作用,但为什么不只是将控件暴露为'Public' ...就我个人而言,我会反对*两种方法 - 暴露控制广泛存在于滥用和不良使用方面。 – STW 2010-07-15 17:44:53

0

暴露包含在WebContol(或与此有关的任何一类)的控件的属性是不是一个很好的设计,因为它使你的代码脆,难以维持。您应该将直接操作TextBoxes的代码放入WebControl中。