2011-05-13 37 views
0
public class TextBoxDerived : System.Web.UI.WebControls.TextBox 
{ 
protected override void OnLoad(EventArgs e) 
{ 
    this.Controls.Add(new LiteralControl("Hello")); 
} 
} 

上面的代码似乎没有做任何事情?将控件添加到文本框(c#/ .net)

我希望像

Hello 
<input type"textbox" /> 

在HTML渲染。

+0

在我看来,你对这个方向是错误的。还有其他方法可以实现这一点。你为什么选择这种方法? – anothershrubery 2011-05-13 09:40:32

回答

1

A TextBox不是CompositeControl,所以它的孩子不会自动呈现。

例如,您可以做的是覆盖Render方法并预先手动呈现控件。

如果你想,因为我认为,提供一个文本框,标签,而不是一些文字内容,也许使用HtmlGenericControlspandiv标签会更适合,以自动呈现逃脱文本。

protected override void Render(HtmlTextWriter writer) 
{ 
    var label = new HtmlGenericControl("span"); 
    label.InnerText = "Hello"; 
    label.RenderControl(writer); 

    base.Render(writer); 
} 
+0

谢谢,这是我想出的解决方案。 如果我创建了system.web.ui.webcontrols.webcontrol()(该文本框派生自)的新实例,则会添加所有子控件。你能解释一下吗? – maxp 2011-05-13 09:49:02

+0

@maxp其实,我想我误解了CompositeControl的要求 - 默认情况下'WebControl'也呈现其子控件。我看了一下Reflector中的'TextBox Render()'方法,发现它实际上并没有调用'base.Render()'(它将呈现子控件),而是手动呈现开始标记,文本和结束标签。 – SirViver 2011-05-13 09:56:15

+1

为了澄清,我应该补充一点,即使有“子”控件也无法解决您的问题,因为子控件将作为TextBoxes的标记中的子节点进行呈现,无论如何这都是非法的。 – SirViver 2011-05-13 10:05:02