2011-11-16 29 views
19

Tôi có một UserControl sử dụng UserControl, cùng với các điều khiển khác.Tất cả điều khiển đều không có trong usercontrol

Trong tập tin ascx Tôi có đoạn mã sau:

<%@ Register TagPrefix="tag" Namespace="some.name.space" Assembly="some.assembly" %> 
<tag:control ID="test" runat="server" /> 

Trong phương pháp Page_Load của tôi, tôi cố gắng thiết lập một tài sản trên kiểm tra như sau:

test.Text = "Hello World!"; 

Điều này thực sự thiết lập thuộc tính Text kiểm soát bằng chữ trong điều khiển người dùng của tôi test.

này ném một ngoại lệ:

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng

Khi nó cố gắng để thiết lập

lblTest.Text = value; 

Đối tượng mà là null là lblTest.

Tôi có không thêm điều khiển người dùng chính xác không? Tôi có nên - hay tôi phải xác định thuộc tính Src khi đăng ký Thẻ? Nếu vậy, tôi phải đăng ký mỗi usercontrol tôi sử dụng?

Điều này cũng dẫn đến việc không có kiểm soát tải trong usercontrol và tất cả các điều khiển là null trong usercontrol.

Trả lời

27

Nếu điều khiển người dùng là trong dự án hiện tại của bạn, sau đó bạn cần phải bao gồm các src trong báo cáo kết quả đăng ký:

<%@ Register TagPrefix="uc1" TagName="NavTop" Src="controls/NavTop.ascx" %> 

Tuy nhiên, nếu bạn sử dụng điều khiển người dùng này trong hơn một trang, sau đó bạn có thể cũng đăng ký nó trong web.config:

<system.web> 
    <pages> 
    <controls> 
     <add tagPrefix="uc1" tagName="NavTop" src="~/controls/NavTop.ascx" /> 
    </controls> 
    </pages> 
</system.web> 

Một điều khác phải nhận thức được: có những lúc các nhà thiết kế visual studio không "nhìn thấy" những thay đổi của bạn để điều khiển trên trang nếu bạn chỉ làm cho những thay đổi trong chế độ xem nguồn. Ví dụ: nếu bạn thay đổi tên điều khiển, bạn có thể kết thúc bằng điều khiển có tên mới trong mã ascx nhưng tham chiếu đến điều khiển có tên cũ trong tệp thiết kế. Khi chạy, điều này sẽ dẫn đến thuộc tính tệp thiết kế là null.

Sau khi bị cháy một số lần, nếu tôi thực hiện bất kỳ thay đổi nào trong chế độ xem nguồn, tôi kiểm tra xem tệp thiết kế đã được cập nhật chính xác chưa hoặc tôi chuyển sang chế độ xem thiết kế, thực hiện thay đổi nhỏ lưu trang/điều khiển người dùng.

+1

Cảm ơn @competent_tech Điều tôi nhận thấy về đăng ký điều khiển trong web.config là điều khiển tổng hợp các điều khiển trong cùng một thư mục - sẽ có lỗi. Nếu bất cứ ai có thể giải thích điều đó với tôi, tôi rất muốn biết tại sao lại thế. – VFein

5

Vấn đề ở đây thường là do cơ chế tải của điều khiển người dùng, chúng tải sau trang thường. Vì vậy, kết quả là các điều khiển chưa được khởi tạo trên usercontrol của bạn (gây ra null ref) trong phương thức page_load chứa. Một cách để giải quyết vấn đề này là chỉ cần tạo và thiết lập một thuộc tính trên usercontrol và có usercontrol wire-up/điền vào giao diện người dùng của riêng nó trong phương thức Page_Load của nó.

Something như thế này:

//Page 
protected void Page_Load(object sender, EventArgs e) 
{ 
    test.Text = "Hello World!"; 
} 

//User Control 
public string Text {get; set;} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblTest.Text = Text; 
} 
1

Hãy thử đặt mã trong Page_prerender sự kiện của trang. Nó sẽ làm việc cho bạn.

+0

Vấn đề với việc sử dụng PreRender cho điều khiển phổ biến là nếu có bất kỳ sự kiện nào trên điều khiển tương tác với các điều khiển khác, dữ liệu sẽ bị thiếu trừ khi được điền trong khi tải. Nếu bạn điền các điều khiển của mình trong khi tải, bạn sẽ có dữ liệu đó có thể truy cập được trong quá trình preRender. Tải -> Sự kiện Fire -> PreRender. PreRender nên được sử dụng khi bạn muốn chắc chắn rằng dữ liệu không phải là cũ (có thể thay đổi bởi một sự kiện). –

+0

Lưu ý rằng Page.PreRender xảy ra sau khi tải trang và bất kỳ điều khiển nào trên trang kích hoạt sự kiện Tải của họ ... trước khi Trang thực sự hiển thị. Đây là cơ hội cuối cùng để liên kết dữ liệu với các điều khiển. –

+0

Điều này không hiệu quả đối với tôi –

1

Tôi gặp sự cố này khi tôi thêm điều khiển người dùng vào mã theo cách sai. Bạn phải sử dụng phương thức Page.LoadControl để khởi tạo điều khiển mà bạn không thể sử dụng mới.

 //WRONG 
     UserControls.BingoCardPage bcp = new UserControls.BingoCardPage(); 
     form1.Controls.Add(bcp); 
     //RIGHT 
     UserControls.BingoCardPage bcp = (UserControls.BingoCardPage)Page.LoadControl("~/UserControls/BingoCardPage.ascx"); 
     form1.Controls.Add(bcp); 
Các vấn đề liên quan