无法访问控制或单击占位符中的事件



我正在尝试创建一个自定义面板扩展器模块。扩展器有效,但如果我试图将旧代码剪切并复制到占位符中,VS2015告诉我存在一些错误。

  1. 错误:"lstXYZ";未声明它可能由于其保护级别而无法访问
  2. 错误:Handles子句需要在包含类型或其基类型之一中定义的WithEvents变量

下面是一个代码示例:

保存面板占位符的用户控件(panelExpander.ascx):

<%-- Begin Panel Wrapper --%>
<div  id="panelContainer" class="Panel collapseable slim" runat="server">

<asp:HiddenField ID="hidPanelClosed" runat="server" Value=""></asp:HiddenField>

<%-- Begin Panel Header --%>
<div class="panel-header PanelHeader">
<span><asp:PlaceHolder runat="server" ID="phPanelHeader" /></span>
<div class="PanelToggleIcon">
<img  id="panelToggleIcon" src="" runat="server">
</div>
</div>
<%-- End Panel Header --%>
<%-- Begin Panel Content --%>
<div id="panelContentContainer" class="panel-content" runat="server">
<asp:PlaceHolder runat="server" ID="phPanelContent" />
</div>
<%-- End Panel Content --%>
</div>
<%-- End Panel Wrapper --%>

在面板中Expander.vb:

''' <summary>
''' ***
''' </summary>
''' <returns></returns>
<PersistenceMode(PersistenceMode.InnerProperty)>
Public Property PanelHeader As ITemplate
''' <summary>
''' ***
''' </summary>
''' <returns></returns>
<PersistenceMode(PersistenceMode.InnerProperty)>
Public Property PanelContent As ITemplate
''' <summary>
''' ***
''' </summary>
''' <param name="sender">sender</param>
''' <param name="e">event Arguments</param>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.Initialize() 'setting some classes etc nothing special
If (IsPostBack) Then
'do stuff
End If
End Sub

上面的代码运行良好。如果我给它喂食没有什么特别的东西,比如:

<%-- Loaded Usercontrol with placeholders --%>
<uc:PanelExpander runat="server">
<%--Panel header--%>
<PanelHeader>
<p>Header Text</p>
</PanelHeader>
<%--Panel content--%>
<PanelContent>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr...</p>
</PanelContent>
</uc:PanelExpander>

这个问题是在MyEditMask.ascx和MyEditMask.vb:中引起的

<%@ Register Src="...panelExpander.ascx" TagName="PanelExpander" TagPrefix="uc" %>
<uc:PanelExpander runat="server">
<panelheader>
<%-- Nothign happens here, works fine. --%>
<asp:Label runat="server" ID="lblHeader" Text="Header"></asp:Label>
</panelheader>
<panelcontent>
<%-- seems ok in ascx but in codebehin it throws errors --%>
<asp:ListBox ID="lstAvailable" runat="server" SelectionMode="Multiple"
DataTextField="CAL_NAME" DataValueField="CAL_ID" Rows="10" CssClass="some classes"></asp:ListBox>
<%-- seems ok in ascx but in codebehin it throws errors --%>
<asp:Button runat="server" ID="btnAdd" Text="Add >> " class="DefaultButton qb-default" />
</panelcontent>
</uc:PanelExpander>

在MyEditMask.vb中(错误所在):

''' <summary>
''' ****
''' </summary>
''' <remarks></remarks>
Private Sub FillListBox()
'Do stuff
' Can't access lstAvailable 
'-> "lstAvailable" not declared it may be inaccessible due to its protection level
lstAvailable.Items.Clear()
'Do Stuff
End Sub

''' <summary>
''' ***
''' </summary>
Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
'btnAdd throws error 
'-> Handles clause requires a WithEvents variable defined in the 
'containing type or one of its base types

'Do Stuff
End Sub

这感觉有点奇怪,因为控件在designer.vb中也因为某种原因而消失了。在我使用任何占位符之前,这一切都有效。我有一种感觉,我复制到占位符中的控件从我的";MyEditMask.vb和MyEditMask.ascx";。为什么会这样?

执行以下操作之一。。。

将ClientIDMode添加到页面声明

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="YourPage.aspx.vb"
ClientIDMode="Static" %>

或者将ClientIDMode添加到控件

<panelcontent>
<%-- seems ok in ascx but in codebehin it throws errors --%>
<asp:ListBox ID="lstAvailable" runat="server" ClientIDMode="Static" SelectionMode="Multiple"
DataTextField="CAL_NAME" DataValueField="CAL_ID" Rows="10" CssClass="some classes"></asp:ListBox>
<%-- seems ok in ascx but in codebehin it throws errors --%>
<asp:Button runat="server" ID="btnAdd" ClientIDMode="Static" Text="Add >> " class="DefaultButton qb-default" />
</panelcontent>

这应该允许您的代码通过其id来识别控件。

好吧!我找到了一个解决方案。特别感谢@Mych!

我已经更改了这个:

<PersistenceMode(PersistenceMode.InnerProperty)>
Public Property PanelContent As ITemplate

到此:

<PersistenceMode(PersistenceMode.InnerProperty)>
<TemplateInstance(TemplateInstance.Multiple)>
Public Property PanelContent As ITemplate

然后我就可以访问MyEditMask中的控件了。只少了一件事。我可以访问控件,但它们被设置为无效。Mych建议我使用"FindControl"方法。终于完成了。

希望这能帮助到有同样问题的人。

最新更新