Tất cả các tên dưới đây là chung chung và không phải là tên thực tế được sử dụng.Các điều khiển được thêm vào trong thiết kế là không có trong Page_Load
Tôi có một UserControl tùy chỉnh với một Panel có chứa một vài Nhãn, cả hai điều khiển .aspx.
.aspx:
<asp:Panel runat="server">
<asp:Label ID="label1" runat="server">
</asp:Label>
</asp:Panel>
<asp:Panel runat="server">
<asp:Label ID="label2" runat="server">
</asp:Label>
</asp:Panel>
codebehind:
private readonly Object object;
protected void Page_Load(object sender, EventArgs e)
{
// These are the lines that are failing
// label1 and label2 are null
label1.Text = object.Value1;
label2.Text = object.Value2;
}
public ObjectRow(Object objectToDisplay)
{
object = objectToDisplay;
}
Trên trang khác, trong đoạn code sau, tôi tạo một đối tượng mới của điều khiển người dùng tùy chỉnh.
protected void Page_Load(object sender, EventArgs e)
{
Usercontrol control = new UserControl(object);
Controls.Add(control);
}
Việc kiểm soát người dùng có tham số và cố gắng để thiết lập các nhãn dựa tắt của đối tượng thông qua vào.
Các nhãn mà nó cố gắng để gán giá trị cho là tuy nhiên, null.
Đây có phải là sự cố vòng đời ASP.net mà tôi không hiểu không? Sự hiểu biết của tôi dựa trên Microsoft ASP.net lifecycle page là các điều khiển trang đã có sẵn sau khi Page_Initialization.
Cách thích hợp để thực hiện việc này là gì? Có cách nào tốt hơn?
EDIT: Từ bên dưới, tôi đã thử sử dụng Page.LoadControl.
Nếu tôi tải điều khiển dựa trên biểu diễn chuỗi của đường dẫn và tên tệp, nó cấm truyền tham số. Tôi có thể phá vỡ điều này bằng cách thêm một phương thức cho phép tôi thiết lập đối tượng. Trong khi điều này làm việc nó cảm thấy hackish. Tôi muốn có thể chuyển giá trị cho hàm tạo nếu điều này là có thể.
Sử dụng phương thức quá tải cho kết quả tương tự như chỉ tải mã phía sau, các nhãn được gán là rỗng.
EDIT: Dường như phương thức quá tải không khởi tạo các điều khiển con được thêm vào tệp .ascx là "theo thiết kế". Tôi tìm thấy điều này trong các ý kiến tại Microsoft's page for Page.LoadControl(type, object[])
Bạn đang sử dụng thuật ngữ khó hiểu. Một điều khiển tùy chỉnh và điều khiển người dùng là những thứ hoàn toàn khác nhau. Một điều khiển người dùng có một mã ascx và một mã phía sau, trong khi một điều khiển tùy chỉnh chỉ đơn giản là một lớp mà hít vào từ lớp System.Web.UI.Control. Bạn đang cố gắng tạo và làm cách nào để thêm chúng vào trang. Bạn đang cố gắng sử dụng cái nào. –
Tôi đang tạo điều khiển người dùng. Tôi sẽ cập nhật mã để phản ánh điều đó. Đối với cách họ đang được thêm vào, tôi đang tạo một thể hiện của điều khiển và sau đó thêm nó vào trang thông qua bộ sưu tập điều khiển của nó. – mwright