ASP.NET访问Panel内的非服务器控件

时间:2011-02-15 16:18:09

标签: c# asp.net custom-controls panel

我有一个继承自Panel的自定义控件。在加载时,我想访问此面板内的所有控件,包括非服务器控件,以操作属性。面板的Controls属性为我提供了服务器控件,但不是非服务器控件。有没有办法访问它们?

例如:

<cc:MyPanel runat="server">
    <asp:TextBox id="txt1" runat="server" />
    <input type="text" id="txt2" />
</cc:MyPanel>

Load事件期间(或者在呈现控件之前的任何事件),我想操纵两个文本框。

由于

2 个答案:

答案 0 :(得分:4)

您必须在每个代码上添加runat='server'或执行一些JavaScript来处理此问题。 load事件正在查看服务器控件。

将您的控件更改为:

<input id="txt2" runat="server" type="text" />

然后你可以这样做:

string s = txt2.Text;

我能想到的另一种方法是,如果您想实际使用表单发布值,然后使用Request.来访问您发布的每个变量。但我的想法是你在寻找前者而不是后者。

最后,如果你去JS路线这里是MSDN的一篇很好的文章,告诉你如何做到这一点: http://msdn.microsoft.com/en-us/library/3hc29e2a.aspx

答案 1 :(得分:0)

我建议使用RegisterStartupScript方法。我做了一个快速测试项目,虽然我不知道你的项目的具体细节,但在我的测试中成功访问和修改了面板内部的客户端和服务器端控件的组合。

<asp:Panel ID="customPanel1" runat="server">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
    <input type="text" id="clientSideInput1" /><br />
    <input type="text" id="clientSideInput2" /><br />
</asp:Panel> 

protected void Page_Load(object sender, EventArgs e)
{
    var controls = customPanel1.Controls;
    foreach(Control c in controls)
    {
        if (c.GetType() == typeof(TextBox))
            ((TextBox)c).Text = "It worked!";
    }
    if (!Page.ClientScript.IsClientScriptBlockRegistered(GetType(), "PageScripts"))
    {
        var jscript = "document.getElementById('clientSideInput1').style.background=\"Red\";";
        jscript += "document.getElementById('clientSideInput2').style.background=\"Yellow\";";
        Page.ClientScript.RegisterStartupScript(GetType(), "PageScripts", jscript, true);
    }
}

为我制作这个......

enter image description here

希望能让你前进!