2009-08-17 5 views
0

템플릿 컨트롤을 만들려고합니다. Field 섹션의 일부로 컨트롤을 자식으로 정의 할 수 있어야합니다. 컴파일하려고하면 "MyTemplateControl.Field '라는 공용 속성에'Button '"이라는 이름의 공용 속성이 없습니다. 누구든지 내가하려는 일을 성취하는 방법을 알고 있습니까?ASP.NET 템플릿 컨트롤

다음은 XHTML 마크 업 예제이며 그 아래에 제 제어 구현이 나와 있습니다.

필자가 찾고자하는 바를 명확히하기 위해 예제를 편집했습니다. MSDN 링크를 이용해 주신 모든 분들께 감사드립니다. 나는 이미 그것들을 겪었습니다.
제가 작성하려고하는 것은 자동으로 테이블을 포맷하는 데이터 입력 컨트롤입니다. 우리는 많은 데이터 입력 웹 폼을 수행하고 구현 시간을 단축하고 싶습니다. 의 GridView는 또한 조작을 허용하지 않습니다

<cc1:MyForm ID="MyForm1" runat="server"> 
    <ViewTemplate> 
     <cc1:Field Question="What is your name?"> 
      <asp:Label ID="myLabel" runat="server" /> 
     </cc1:Field> 
    </ViewTemplate> 
    <EditTemplate> 
     <cc1:Field Question="What is your name?"> 
      <asp:Textbox ID="myTextbox" runat="server" /> 
     </cc1:Field> 
    </EditTemplate> 
</cc1:MyForm> 

public class MyForm : WebControl, INamingContainer 
{ 
    private FieldCollection _fieldCollection; 
    private FieldCollection _field2Collection; 

    public FieldCollection ViewTemplate 
    { 
     get 
     { 
      if (_fieldCollection == null) 
      { 
       _fieldCollection = new FieldCollection(); 
      } 
      return _fieldCollection; 
     } 
    } 

    public FieldCollection EditTemplate 
    { 
     get 
     { 
      if (_field2Collection == null) 
      { 
       _field2Collection = new FieldCollection(); 
      } 
      return _field2Collection; 
     } 
    } 
} 

public class FieldCollection : CollectionBase 
{ 
    . 
    . 
    . 
} 

[ParseChildren(false)] 
public class Field 
{ 
    . 
    . 
    . 
} 

답변

0

, 대신 MyForm1.FindControl ("을 myButton") 또한

내가 템플릿은 ITemplate에서 파생되지 않은 알이를 사용 인터페이스. 평소와 마찬가지로 ASP.Net은 System.Web.UI.Control을이 impl의 기본 클래스로 사용합니다.

2

구현에 이상한 점이 있습니다. 템플릿 컨트롤을 만들거나 자식 컨트롤 목록을 추가 할 수있는 컨트롤을 만들기 위해 무엇을하고 싶은지를 이해하는 것은 어렵습니다.

템플릿 기반 접근 방식의 경우이 같은 뭔가를해야 할 것 :

public class MyForm : WebControl, INamingContainer 
{ 

    private TemplateOwner templateOwner{ get; set; } 

    private ITemplate _Content; 
    public ITemplate Content 
    { 
     get 
     { 
     return this._Content; 
     } 
     set 
     { 
     _Content = value; 
     } 
    } 

    protected override void CreateChildControls() 
    { 
     base.Controls.Clear(); 

     templateOwner = new TemplateOwner(); 
     this.Content.InstantiateIn(templateOwner); 

     this.Controls.Add(templateOwner); 
    } 

    ... 
} 

[ToolboxItem(false)] 
public class TemplateOwner : WebControl{ 

    public TemplateOwner():base(HtmlTextWriterTag.Div) 
    { 
    } 
} 

이 사용법은 다음

<cc1:MyForm ID="MyForm1" runat="server"> 
    <Content> 
     <!-- Place whatever HTML, ASP.net controls etc you like --> 
    </Content> 
</cc1:MyForm> 

과 같을 것이다 당신은 여전히 ​​동작을 구성 할 적절한 주석을 추가 할 수있다 디자이너의 나는 당신에게 아이디어를주기 위해 이것을 썼다.

<asp:PlaceHolder ID="plchAdd" runat="server"></asp:PlaceHolder> 

이 프레임

의 바닥이 될 것입니다

<%@ Control Language="C#" AutoEventWireup="true" 
      CodeBehind="SmallFramedControl.ascx.cs" 
      Inherits="OtPortalNewDesign.UserControls.SmallFramedControl" %> 

이 프레임의 상단 될 것입니다 :

public partial class SmallFramedControl : UserControl, INamingContainer 
{ 
    private TemplateOwner templateOwner { get; set; } 
    private ITemplate _Content; 
    public ITemplate Content 
    { 
     get 
     { 
      return this._Content; 
     } 
     set 
     { 
      _Content = value; 
     } 
    } 

    protected override void CreateChildControls() 
    { 
     //base.Controls.Clear(); 
     templateOwner = new TemplateOwner(); 
     this.Content.InstantiateIn(templateOwner); 
     plchAdd.Controls.Add(templateOwner); 
    } 



    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

[ToolboxItem(false)] 
public class TemplateOwner : WebControl 
{ 
    public TemplateOwner() 
     : base(HtmlTextWriterTag.Div) 
    { 
    } 
} 

및 ASCX 페이지보기와 같은 :

+0

닫기,하지만 나는 그것이 필요합니다 furthe r 확장. 내 editted 질문을 참조하십시오. – user62064

+0

ehm..well. ITemplate 유형의 "Content"와 같은 다른 속성을 추가하고 계속하십시오. 그것은 작동해야합니다. 컬렉션과 관련된 것은 필요하지 않습니다. 템플릿 내에서 원하는 것을 넣을 수 있으므로 FieldCollection을 잊어 버릴 수 있습니다. 그렇지 않으면 달성하고자하는 것은 템플릿이 아니므로 FieldCollection- 방식으로 가야합니다. 이들은 서로 다른 두 가지입니다. – Juri

+0

이 작업은 WebApplicationProject와 작동합니까 ?? – Mahes

0

나는 다음과 같은 코드를 사용
관련 문제