我已经研究过FindControl调用,但我发现没有提到Public Shared Sub问题。我正在使用aspx页面,它在vb.net中是代码隐藏的。我没有使用母版页。
我已经在正常的Public Sub方法中成功地在此页面上使用FindControl,如下面引用名为panContent的主要Panel对象。
Dim rdobtn As RadioButton = DirectCast(panContent.FindControl("rbFarm"), RadioButton)
但是在Public Shared Sub中,无法使用panContent对象。我收到错误“对非共享成员的引用需要对象引用”。我尝试使用Page.FindControl(“panContent”)和Me.FindControl(“panContent”)创建一个Panel对象,并得到相同的错误。 aspx页面按以下顺序排列:body标签,form标签,scriptmanager标签,Update Panel(名为upMain),然后是主Panel(名为panContent)。
如何从控件创建对象,以便更改Shared Sub中的对象属性?
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>
Code-Behind(仅显示相关项目)
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对象。得到了同样的错误。
答案 0 :(得分:1)
您是否动态创建控件?如果你是,你需要在PageInit期间这样做。您是否在创建之前尝试“找到”它?
更多代码会有所帮助。