Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET访问面板内的非服务器控件_C#_Asp.net_Custom Controls_Panel - Fatal编程技术网

C# ASP.NET访问面板内的非服务器控件

C# ASP.NET访问面板内的非服务器控件,c#,asp.net,custom-controls,panel,C#,Asp.net,Custom Controls,Panel,我有一个从面板继承的自定义控件。在加载时,我希望访问此面板中的所有控件,包括非服务器控件,以操作属性。面板的控件属性提供服务器控件,但不提供非服务器控件。有没有办法接近它们 例如: <cc:MyPanel runat="server"> <asp:TextBox id="txt1" runat="server" /> <input type="text" id="txt2" /> </cc:MyPanel> 在Load事件期间

我有一个从
面板继承的自定义控件。在加载时,我希望访问此面板中的所有控件,包括非服务器控件,以操作属性。面板的
控件
属性提供服务器控件,但不提供非服务器控件。有没有办法接近它们

例如:

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

Load
事件期间(或者在呈现控件之前的任何事件),我希望操作这两个文本框


谢谢

您必须在每个标记上添加
runat='server'
,或者使用一些JavaScript来处理这个问题。 load事件正在查看服务器控件

将控件更改为:

<input id="txt2" runat="server" type="text" />
我唯一能想到的另一种方法是,如果您想实际使用表单发布值,然后使用
Request.
访问您发布的每个变量。但我的想法是,你更喜欢前者,而不是后者

最后,如果您选择JS路线,这里有一篇来自MSDN的优秀文章,向您展示了如何做到这一点:
我建议使用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);
    }
}





受保护的无效页面加载(对象发送方、事件参数e) { var controls=customPanel1.控件; foreach(控件中的控件c) { if(c.GetType()==typeof(TextBox)) ((TextBox)c).Text=“成功了!”; } 如果(!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); } }
为我制作这个


希望这能让你走

如果使用Javascript,请查看
Page.ClientScript
以在运行时注册Javascript代码/包含。谢谢,我特别不想强制这些控件成为服务器控件,因为我只想将其包装在现有标记上,但我没有考虑使用Javascript。这应该对我有用。这让我很好奇,@JoeEnos,因为我想知道为什么在同一个控件中使用aspnet文本框和input/text,而aspnet文本框本身呈现为input/text控件,那么为什么不使用两个aspnet文本框呢?一定有一些特殊的原因,为什么你的方法是必要的,我很想知道它是什么!没什么特别的。我正在构建一个围绕现有标记的控件,根据用户权限使内容可见、不可见或只读。在整个解决方案中,各种表单的执行方式不同,因此我只想确保此控件对ASP.NET服务器控件或客户端控件起作用。它们可能不会同时存在,但我希望我的控件能够正常工作,不管页面是以何种方式设计的。嘿,我不会想到这一点。酷!谢谢谢谢,但是我实际上需要处理任意数量的元素,所以我在服务器代码中没有特定的ID。我的解决方案是使用javascript(特别是jQuery)访问面板中的每个元素,并完成需要完成的工作。
<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);
    }
}