2016-05-25 7 views
0

カスタムPanel-Expander-Moduleを作成しようとしています。 Expanderは機能しますが、古いコードをカットしてプレースホルダにコピーしようとすると、VS2015はエラーがあることを知らせます。プレースホルダ内のコントロールまたはクリックイベントにアクセスできない

  1. エラー:「lstXYZは」、その保護レベルにはアクセスできない可能性が宣言されていない
  2. エラー:句が含まタイプまたはその基本タイプのいずれかで定義されたWITHEVENTS変数を必要とハンドル

ここでのコードの例である:パネルのプレースホルダを保持

ユーザーコントロール(panelExpander.ascx):

デpanelExpander.vbで
<%-- 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 --%> 

 ''' <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にここに原因で発生します(エラーがある)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> 

''' <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 

何らかの理由で、デザイナーでもコントロールが消えるため少し奇妙に感じます。これは、プレースホルダを使用する前にすべて機能しました。プレースホルダーにコピーしたコントロールがMyEditMask.vbとMyEditMask.ascxのビューから消えてしまったという気がします。それでも私は理由を理解できません。

誰かが私を助けることを願って、私はおかしくなりそうだ、それはとても簡単そうですが、高度でまだ...

ありがとう!

+1

これは、lstAvailableとbtnAddが別のコントロールの内部にあるために起こっています... ClientIDMode = "Static"をページ宣言またはリストビューに追加してボタン – Mych

答えて

1

いいえ!私は解決策を見つけました。 @Mychに特別なおかげです!

私はこれを変更した:

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

この目的のために:

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

は、その後、私はMyEditMaskのコントロールにアクセスすることができました。一つだけ欠けていました。コントロールにアクセスできましたが、何も設定されていませんでした。 Mychは "FindControl"メソッドを使用することを提案していました。それでそれは最終的に行われました。

これは、同じ問題を抱えている人に役立ちます。

1

は、次のいずれかの操作を行います...

これはあなたのコードがコントロールを識別できるようにする必要があり、ページ宣言

<%@ 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> 

コントロールにClientIDModeにを追加します彼らのidによって。

+0

にお返事ありがとうございます。私はあなたが私に提案したことを試しました。それでも、私は同じエラーが発生します... ClientIDModeがコントロール上で、あるいはページ上で、あるいは同時に、静的に設定されているかどうかは関係ありません。私はもう何をすべきかわからない、このプロジェクトは私を夢中にさせている!編集:リストボックスをpanelcontentタグの外側に置いても、まだ私のpanelexpanderの内側に置くと、それは働いています... – Megajin

+1

これは時々起こります。 findControlを使用してコントロールを 'マイニング'する必要があるとします.https://msdn.microsoft.com/en-us/library/486wc64h(v = vs.110).aspxを参照してください。子コントロールを見つけて反復することができ、子コントロールの子が可能です – Mych

関連する問題