【问题标题】:ASP.NET access non-server controls inside PanelASP.NET 访问 Panel 内的非服务器控件
【发布时间】:2011-06-27 17:39:19
【问题描述】:

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

例如:

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

Load 事件(或者实际上是控件呈现之前的任何事件)期间,我想操作两个文本框。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    将控件更改为:

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

    那么你可以这样做:

    string s = txt2.Text;
    

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

    最后,如果你走 JS 路线,这里有一篇来自 MSDN 的好文章,向你展示了如何做到这一点: http://msdn.microsoft.com/en-us/library/3hc29e2a.aspx

    【讨论】:

    • 如果使用 Javascript,请查看 Page.ClientScript 在运行时注册 javascript 代码/包含。
    • 谢谢,我特别不想强迫这些成为服务器控件,因为我只想将它包装在现有标记周围,但我没有考虑过使用 javascript。这应该对我有用。
    • 这让我非常好奇,@JoeEnos,因为我想知道为什么当 aspnet 文本框本身呈现为输入/文本控件时,您为什么在同一个控件中使用 aspnet 文本框和输入/文本,那么为什么不使用两个 aspnet 文本框呢?必须有一些特殊的原因说明你的方法是必要的,我很想知道它是什么!
    • 没什么特别的。我正在构建一个仅包含现有标记的控件,根据用户权限使事物可见、不可见或只读。各种表单在我们的解决方案中以不同的方式完成,因此我只想确保此控件适用于 ASP.NET 服务器控件或客户端控件。它们可能不会一起存在,但我希望我的控件能够正常工作,无论页面的设计方式如何。
    • 嘿,我不会想到的。凉爽的!谢谢!
    【解决方案2】:

    我会推荐 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);
        }
    }
    

    为我制作这个...

    希望能助你一臂之力!

    【讨论】:

    • 谢谢,但我实际上需要处理任意数量的元素,所以我不会在服务器代码中包含特定的 ID。我的解决方案是使用 javascript(特别是 jQuery)来访问我面板中的每个元素,然后做需要做的事情。
    猜你喜欢
    • 2011-03-24
    • 2020-07-22
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2011-04-07
    • 2017-09-06
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多