2010-03-15 31 views
9

tôi đã xây dựng một tùy chỉnh WebControl, trong đó có cơ cấu như sau:Render nhiều bộ sưu tập kiểm soát trong ASP.NET điều khiển tùy chỉnh

<gws:ModalBox ID="ModalBox1" HeaderText="Title" runat="server"> 
    <Contents> 
     <asp:Label ID="KeywordLabel" AssociatedControlID="KeywordTextBox" runat="server">Keyword: </asp:Label><br /> 
     <asp:TextBox ID="KeywordTextBox" Text="" runat="server" /> 
    </Contents> 
    <Footer>(controls...)</Footer> 
</gws:ModalBox> 

Việc kiểm soát chứa hai thuộc tính ControlCollection, 'Nội dung' và 'Footer'. Không bao giờ cố gắng để xây dựng một điều khiển với nhiều bộ sưu tập kiểm soát, nhưng giải quyết nó như thế này (giản thể):

[PersistChildren(false), ParseChildren(true)] 
public class ModalBox : WebControl 
{ 
    private ControlCollection _contents; 
    private ControlCollection _footer; 

    public ModalBox() 
     : base() 
    { 
     this._contents = base.CreateControlCollection(); 
     this._footer = base.CreateControlCollection(); 
    } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ControlCollection Contents { get { return this._contents; } } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ControlCollection Footer { get { return this._footer; } } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     // Render content controls. 
     foreach (Control control in this.Contents) 
     { 
      control.RenderControl(output); 
     } 

     // Render footer controls. 
     foreach (Control control in this.Footer) 
     { 
      control.RenderControl(output); 
     } 
    } 
} 

Tuy nhiên có vẻ như hiển thị chính xác, nó không hoạt động nữa nếu tôi thêm một số nhãn asp.net và đầu vào kiểm soát bên trong tài sản (xem mã asp.net ở trên). Tôi sẽ nhận được HttpException:

Không thể tìm thấy quyền kiểm soát với id 'KeywordTextBox' mà được liên kết với Nhãn 'KeywordLabel'.

Có thể dễ hiểu vì nhãn xuất hiện trước hộp văn bản trong bộ sưu tập kiểm soát. Tuy nhiên, với điều khiển asp.net mặc định nó hoạt động, vậy tại sao nó không hoạt động? Tôi đang làm gì sai? Thậm chí có thể có hai bộ sưu tập kiểm soát trong một điều khiển không? Tôi có nên làm cho nó khác đi không?

Cảm ơn bạn đã trả lời.

Trả lời

2

Bạn có thể sử dụng hai Panels như cha mẹ của hai bạn bộ sưu tập kiểm soát (và chúng sẽ cung cấp khả năng đọc nhóm và cải thiện). Thêm điều khiển của bạn từ mỗi bộ sưu tập vào bộ sưu tập Điều khiển của bảng điều khiển tương ứng, và trong phương pháp Render chỉ cần gọi phương thức Render của mỗi bảng. Các bảng sẽ tự động hiển thị con cái của chúng và sẽ cung cấp cho chúng các không gian tên riêng của chúng, vì vậy, bạn có thể có các điều khiển với các ID tương tự trong các bảng khác nhau.

+0

Có điều này sẽ làm việc! –

1

Tôi không chắc chắn rằng nó sẽ làm việc. Tuy nhiên, nếu bạn sử dụng các mẫu, bạn có thể có được điều khiển để hiển thị đầu ra chính xác.

Đầu tiên, định nghĩa một lớp được sử dụng như các loại cho sự kiểm soát container:

public class ContentsTemplate : Control, INamingContainer 
{ 
} 

Và bây giờ điều khiển tùy chỉnh:

[PersistChildren(false), ParseChildren(true)] 
public class ModalBox : CompositeControl 
{ 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(ContentsTemplate))] 
    public ITemplate Contents { get; set; } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(ContentsTemplate))] 
    public ITemplate Footer { get; set; } 

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

    var contentsItem = new ContentsTemplate(); 
    Contents.InstantiateIn(contentsItem); 
    Controls.Add(contentsItem); 

    var footerItem = new ContentsTemplate(); 
    Footer.InstantiateIn(footerItem); 
    Controls.Add(footerItem); 
    } 

} 
+0

Tôi đang gặp vấn đề tương tự như op và điều này sẽ không hoạt động. Bạn không thể tham chiếu bất kỳ điều khiển nào trong ITemplates vì ​​chúng không được khởi tạo đúng cách, điều này đánh bại mục đích của kiểu điều khiển này. – mattmanser

Các vấn đề liên quan