2011-01-21 20 views
9

Có rất nhiều thông tin trên web về vòng đời ASP.NET, nhưng tôi không thể tìm ra khi nào tự động thêm các điều khiển vào trang.Sự khác biệt với việc tạo và thêm các điều khiển trong PreInit Init

Nói chung có hai tình huống; một trang aspx với một trang chủ, và một trang không có. Cuốn sách tôi hiện đang đọc (70-515 tự chuẩn bị) nói để thêm điều khiển cho một trang mà không có một trang chủ trong eventhandler preinit. Để tự động thêm các điều khiển vào một trang nội dung, tôi nên đặt logic đó trong bộ quản lý sự kiện init.

Theo MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) Tôi nên tạo hoặc tạo lại các điều khiển động trong trình xử lý sự kiện tiền tố, và chỉ đọc hoặc khởi tạo các thuộc tính của các điều khiển trong init eventhandler (có ý nghĩa nhất đối với tôi). Googling xung quanh tôi thấy rất nhiều người sử dụng eventhandler init để thêm điều khiển.

Vì vậy, tôi bị mất một chút ở đây - cách chính xác là gì? Và khi sử dụng trình xử lý sự kiện tiền tố, bạn có thể thêm các điều khiển vào trang của mình như thế nào khi tất cả các điều khiển đều là rỗng? Ví dụ: khi bạn cần thêm hộp văn bản được tạo động vào bảng điều khiển?

Trân trọng!

Trả lời

8

Trừ khi bạn cần phải chơi xung quanh với các thuộc tính điều khiển thiết lập trước khi theo dõi ViewState, tôi sẽ đích thân tiếp tục và đặt logic bổ sung điều khiển động trong sự kiện OnInit.

Nếu bạn thực sự muốn tự động thêm một điều khiển trong PreInit (khi sử dụng trang chủ), bạn luôn có thể làm một cái gì đó như thế này:

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 

    TextBox textBox = new TextBox(); 
    textBox.Text = "Dynamic TextBox"; 
    textBox.Width = 100; 
    textBox.ReadOnly = false; 

    var master = this.Master; 

    plcHolder.Controls.Add(textBox); 
    textBox.ApplyStyleSheetSkin(this.Page); 

} 

truy cập vào "Thạc sĩ" bất động sản sẽ nhanh chóng điều khiển và nó nên làm việc, nhưng bạn nhận được các kịch bản trang chủ lồng nhau (this.Master.Master ...), cập nhật các bảng và vân vân.

Điều này có thể có liên quan và hữu ích: http://weblogs.asp.net/ysolodkyy/archive/2007/10/09/master-page-and-preinit.aspx

Hơn nữa, một trong những lý do tôi có thể nghĩ đến (ngoài sau vòng đời trang định nghĩa) MS khuyến cáo rằng chúng ta đặt tất cả các logic để tạo kiểm soát năng động trong sự kiện PreInit vì vậy chúng tôi có thể tận dụng dịch vụ chủ đề, sẽ áp dụng tất cả các thuộc tính da có sẵn tự động cho chúng tôi, trước khi sự kiện Init diễn ra.

Giả sử đánh dấu của bạn trông giống như thế:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Trace="true" Inherits="_Default" Theme="Test" %> 

...

<form id="form1" runat="server"> 

<div> 
<p> 
    <asp:TextBox ID="TextBox1" runat="server" TextMode="Password" Text="Control TextBox"></asp:TextBox> 
</p> 
<p> 
    <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder> 
</p> 

</div> 
</form>... 

và bạn có một làn da như thế này:

<asp:TextBox runat="server" BackColor="Yellow" Wrap="false" Text="Skin property!" > </asp:TextBox> 

Chỉ cần thêm video này vào mã của bạn đằng sau:

private TextBox tb1; 
protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
    tb1 = new TextBox(); 
    tb1.Text = "PreInit Dynamic TextBox"; 

    Trace.Write(String.Format("tb1 Wrap Property-> {0}",tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
    Trace.Write("Add tb1 to the placeholder."); 
    plcHolder.Controls.Add(tb1); 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
} 

protected override void OnInit(EventArgs e) 
{ 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
    base.OnInit(e); 
} 



protected void Page_Load(object sender, EventArgs e) 
{ 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 

} 

Bạn sẽ thấy như thế nào trước khi đi sâu vào sự kiện Init tất cả các đặc tính da đã được áp dụng cho hộp văn bản được tạo động :)

1

Sự kiện PreInit là mới với tôi, nhưng tôi đoán nó có ý nghĩa, nên bạn chỉ còn một bước trung gian ở giữa tải điều khiển và tải ViewState để làm công việc bổ sung. Chúng tôi đã sử dụng sự kiện init để tải các điều khiển động và điều này luôn làm việc cho chúng tôi mà không có vấn đề gì. Tôi nghĩ rằng bạn sẽ được OK với một trong hai, nhưng nếu MS giới thiệu PreInit, tôi muốn nói đi con đường đó. Bằng cách này, trong Init, bạn có thể thực hiện bất kỳ công việc bổ sung nào mà bạn có thể cần và tách ra thường trình tạo giao diện người dùng so với thường trình có thể cập nhật nó trước khi tải ViewState.

HTH.