【问题标题】:FindControl not working in Shared SubFindControl 在共享子中不起作用
【发布时间】:2023-03-26 22:49:01
【问题描述】:

我研究了 FindControl 调用,但没有发现任何提及 Public Shared Sub 问题。我正在使用一个 aspx 页面,它是 vb.net 中的代码隐藏。我没有使用母版页。

我已经在这个页面上成功地使用 FindControl 在正常的公共子方法中,如下所示,引用名为 panContent 的主面板对象。

Dim rdobtn As RadioButton = DirectCast(panContent.FindControl("rbFarm"), RadioButton)

但在公共共享子中,不能使用 panContent 对象。我收到错误“对非共享成员的引用需要对象引用”。我尝试使用 Page.FindControl("panContent") 和 Me.FindControl("panContent") 创建一个 Panel 对象并得到相同的错误。 aspx 页面的顺序是:body 标签、form 标签、scriptmanager 标签、一个更新面板(命名为 upMain),然后是主面板(命名为 panContent)。

如何从控件创建对象,以便更改共享子中的对象属性?

Aspx 页面(为空间而编辑)

<%@ Page Language="VB" AutoEventWireup="false" Inherits="GM._Default" CodeBehind="Default.aspx.vb" %>
<% Register Assembly="AjaxControlToolkit, Version, etc... %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>GMN</title>
    <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js"></script>
    <script type="text/javascript">
    function fnConfirmMsg() {
        var ans = confirm("This will delete any saved bank information. Continue?");
        if (ans == true) {
            $.ajax({
                type: "POST",
                url: "Default.aspx/DraftContinue",
                contentType: 'application/json; charset=utf-8',
                data: '{}',
                dataType: 'json',
                success: function (result) {
                }
            });
            return true;
        }
        else {
            return false;
        }
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <asp:UpdatePanel ID="upMain" runat="server" UpdateMode="conditional">
            <ContentTemplate>
                ...other divs...
                <div id="centercontent">
                    <asp:Panel ID="panContent" runat="server">
                        <table border="0">
                            ...other <tr> with controls...
                            <tr>
                                <td>
                                    <asp:DropDownList ID="ddlDraft" runat="server" AutoPostBack="true">
                                        <asp:ListItem Value="Y">Yes</asp:ListItem>
                                        <asp:ListItem Value="N">No</asp:ListItem>
                                    </asp:DropDownList>
                                </td>
                                <td>
                                    <asp:RadioButton ID="rbFarm" runat="server" AutoPostBack="true" />
                                </td>
                            </tr>
                            ...other <tr> with controls...
                        </table>
                    </asp:Panel>
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

代码隐藏(仅显示相关项目)

Protected Sub ddlDraft_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlDraft.SelectedIndexChanged
    If ViewState("DraftYorN").Equals("Y") And ddlDraft.SelectedValue = "N" Then
        ScriptManager.RegisterStartupScript(Me, Me.GetType(), "callConfirmMsg", "fnConfirmMsg();", True)
    End If
End Sub

<System.Web.Services.WebMethod()> _
Public Shared Sub DraftContinue()
    Dim ddlDraft As DropDownList = DirectCast(panContent.FindControl("dlDraftRenewMembership"), DropDownList)
    Dim rbtnFarm as RadioButton = DirectCast(panContent.FindControl("rbFarm"), RadioButton)
    If ddlDraft.SelectedValue = "N" then
        rbtnFarm.Checked = True
    End If
End Sub

它的 panContent 给出了错误。所以我想我会使用它的容器 upMain 来制作 panContent 对象。遇到同样的错误。

【问题讨论】:

    标签: asp.net vb.net shared findcontrol


    【解决方案1】:

    您是否在动态创建控件?如果是,则需要在 PageInit 期间执行此操作。您是否尝试在创建它之前“找到”它?

    更多代码会有所帮助。

    【讨论】:

    • 我没有动态创建控件。我有几个控件,我想在调用该方法时对其进行更改。所有的控件都是在 aspx 页面上创建的。但是 Shared 方法不会让我只调用一个控件,我必须在方法中创建它的一个实例。我通常使用 FindControl 来做到这一点。但似乎我尝试使用的每个容器都给了我帖子中提到的相同错误消息。最外层的容器就是页面本身,但是如何在 Shared 方法中创建整个页面的实例呢?
    • 我想要完成的事情:我有一个下拉列表,我需要它来打开一个确认框,但只有当它的选择从“是”变为“否”时。所以我在它的事件处理程序中添加了一个 if...then 以在发生这种情况时调用一个 javascript 函数。 javascript函数创建确认框,如果确认答案为YES,将获取确认框答案并使用ajax调用代码隐藏方法进行额外更改。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    相关资源
    最近更新 更多