4

サイトを検索しましたが、問題の解決策が見つからないため、すでに回答されている場合はお詫びします(誰かが以前にこれを尋ねたに違いありません)。

WebControlおよびIScriptControlとしてパッケージ化したjQueryポップアップウィンドウを作成しました。最後のステップは、コントロールのタグ内にマークアップを書き込めるようにすることです。InnerProperty属性を数回使用しましたが、厳密に型指定されたクラスのリストを含めるためだけです。

WebControlのプロパティは次のとおりです。

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
   get
   {
      if (_content == null)
      {
         _content = new something???();
      }
      return _content;
   }
}
private something??? _content;

これが私が求めているもののHTMLマークアップです:

   <ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
      Modal="true" WindowCaption="Test Window" CssClass="window">
      <Content>
         <div style="display:none;">
            <asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
         </div>
         <%--Etc--%>
         <%--Etc--%>
      </Content>
   </ctr:WebPopup>

残念ながら、Contentプロパティのタイプがわかりません。基本的にUpdatePanel'sを複製する必要がありContentTemplateます。

編集:以下では、テンプレートコンテナを自動的に作成できますが、コントロールが表示されません。私が行っていることの何が問題になっていますか?

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
    get
    {
        return _content;
    }
    set
    {
        _content = value;
    }
}
private ITemplate _content;

EDIT2:CreateChildControlsをオーバーライドすると、ITemplate内のコントロールをレンダリングできます。

protected override void CreateChildControls()
{
   if (this.Content != null)
   {
      this.Controls.Clear();
      this.Content.InstantiateIn(this);
   }
   base.CreateChildControls();
}

残念ながら、ファイルの分離コードファイルからITemplate内のコントロールにアクセスできなくなりました。つまり、マーク内にボタンをそのように配置した場合:

<ctr:WebPopup runat="server" ID="win_StatusFilter">
   <Content>
      <asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
   </Content>
</ctr:WebPopup>

btn_Testその後、コードビハインドからアクセスできなくなります。

protected void Page_Load(object sender, EventArgs e)
{
   btn_Test.Text = "btn_Test is not present in Intellisense and 
      is not accessible to the page. It does, however, render correctly.";
}

EDIT3:修正済み!編集2は正しい解決策です。VisualStudios2010がお尻の痛みだっただけです。アプリを閉じて再度開くと、Contentプロパティ内のすべてのコントロールにページからアクセスできました。

EDIT4:Edit2は問題を修正しませんでした。誰かが言及する前に私はすでにその[TemplateInstance(TemplateInstance.Single)]属性を試していましたが、当時はそれが違いを生んだとは思いませんでした。VisualStudios2010は今日奇妙なものになっているようです。

タグを削除して機能し続けたので、属性に違いはないと思いました。コードに戻ってから、コントロールは使用できなくなりました。属性を追加し直すと、すべてが機能し、サーバー側でコントロールにアクセスできるようになります。マッドネス。ブライアンが誰よりも早く修正について言及したので、私はブライアンの答えを受け入れます。

4

2 に答える 2

5

パブリックITemplateコンテンツ

次に、次のようにUIにレンダリングします。

Label label = new Label();
this.Content.InstantiateIn(label);

//Render label

編集:テンプレートも定義していることを確認してください

[TemplateInstance(TemplateInstance.Single)]

これにより、テンプレート内のコントロールに直接アクセスできるようになります。

于 2010-04-30T16:11:42.550 に答える
1

これを使用してみてください:

win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.

それ以外の場合は、次の記事のように、コントロールのいくつかのプロパティを定義する必要があります:http: //msdn.microsoft.com/ru-ru/library/36574bf6%28v=VS.90%29.aspx


更新:UpdatePanelのContentTemplateプロパティに関するこの記事のコメントによると:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=VS.90).aspx

TemplateInstanceAttribute値があるため、ContentTemplateからコントロールを取得できます(UpdatePanel.ContentTemplateにはTemplateInstance.Single)。

したがって、次のコードのみを使用する必要があります。

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content

詳細については、以下をご覧ください。

http://msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=VS.90).aspx

于 2010-05-04T09:28:15.540 に答える