如何在自定义web控件上动态创建一些公共属性。动态创建公共属性
例如,Web控件有5个TextBox控件。我需要每个TextBox控件的公共属性来设置TextBox控件的特定属性。
我希望能够循环webcontrol中的控件并为每个TextBox控件创建一个公共属性。
有什么想法?
如何在自定义web控件上动态创建一些公共属性。动态创建公共属性
例如,Web控件有5个TextBox控件。我需要每个TextBox控件的公共属性来设置TextBox控件的特定属性。
我希望能够循环webcontrol中的控件并为每个TextBox控件创建一个公共属性。
有什么想法?
编辑:
如果孩子的控件存在于设计时,那么你需要解释为什么要动态地添加属性访问控制成员 - 除非有一个很好的理由,它只是听起来像一个糟糕的设计。
这里是我的建议:
留下您的控件Friend
或Private
- 不直接暴露它们(它导致紧密耦合,并随着时间的推移变得讨厌)。
公开一个新的公共属性,获取/设置控件的1x上的相应属性;所以如果你想在5x TextBoxes上设置.Text
,你将拥有5x属性。
完成它。
如果您试图通过动态添加它们来变得聪明,那么这是一个很好的意图,会导致糟糕的结果。请记住:KISS(保持简单,愚蠢!)。
在设计时出席。 – 2010-07-15 15:35:21
那么为什么动态添加属性 - 只需将其相关的属性添加到类 - 在属性设置器更新相应的控制值。 – STW 2010-07-15 15:45:39
您可以创建这样
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;
}
}
我需要能够设置值,虽然...... – 2010-07-15 15:06:42
只要你不试图用这种方法设置文本框的集合,即使这个属性是只读的,你仍应该可以。你会做一些像'myControl.TextBoxes [0] .Text =“Test”;' – 2010-07-15 15:12:37
这将起作用,但为什么不只是将控件暴露为'Public' ...就我个人而言,我会反对*两种方法 - 暴露控制广泛存在于滥用和不良使用方面。 – STW 2010-07-15 17:44:53
暴露包含在WebContol(或与此有关的任何一类)的控件的属性是不是一个很好的设计,因为它使你的代码脆,难以维持。您应该将直接操作TextBoxes的代码放入WebControl中。
你可以让它们成为公共的,然后你可以从页面访问它们。 – 2010-07-15 17:47:07