2011-11-16 42 views
19

Diğer denetimler arasında bir UserControl kullanan bir UserControl var. Aşağıdaki kod var ascx dosyasındaTüm denetimler usercontrol içinde boştur

:

test.Text = "Hello World!"; 

Bu aslında metin özelliği ayarlar: Benim Page_Load yöntemde

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

, ben şöyle testinden özelliğini ayarlamaya Kullanıcı denetimi test içinde bir tam denetimin. öyle boş

lblTest.Text = value; 

nesneyi ayarlamaya çalışan bir nesneye

örneğine ayarlanmadı

nesne başvurusu:

Bu

bir istisna atar lblTest.

Kullanıcı denetimini doğru şekilde eklemiyorum mu? Bir Etiketi kaydederken Src özelliğini belirtmeli miyim? Eğer öyleyse, kullandığım her kullanıcı kontrolünü kaydetmem gerekir mi?

Bu ayrıca, usercontrol'de hiçbir kontrol yüklemesiyle sonuçlanmaz ve tüm kontroller usercontrol içinde sıfırdır. Birden fazla sayfa bu kullanıcı denetimi kullanırsanız o zaman yapabilirsiniz, ancak

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

: Kullanıcı kontrol Mevcut projede ise

cevap

27

, o zaman kayıt açıklamada src eklemeniz gerekir Ayrıca web.config'de kaydetmek:

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

bir başka şey dikkat edilmesi gereken: kez sadece değişiklik yaparsanız görsel stüdyo tasarımcı sayfadaki denetimlere değişiklikleri "görmek" vermediğinde vardır kaynak görünümü. Örneğin bir kontrol adını değiştirirseniz, ascx'deki yeni isimle bir kontrolle, ancak tasarımcı dosyasındaki eski isimle bir kontrole bir referansla sonuçlanabilir. Çalışma zamanında, bu, tasarımcı dosyası özelliğinin null olmasını sağlar.

Birkaç kez yanmış olduktan sonra, kaynak görünümünde herhangi bir değişiklik yaparsam, tasarımcı dosyasının doğru şekilde güncellendiğini veya tasarım görünümüne geçtiğimi, küçük bir değişiklik yaptığımı kontrol ederim. sayfayı/kullanıcı kontrolünü kaydedin.

+1

teşekkürler kontrolü aynı dizin içinde kontrollerin bir bileşik denetim olup olmadığından web.config'de kontrolleri kaydetme hakkında fark şeydir @competent_tech - bir hata olacaktır. Bunu bana açıklayabilirse, bunun nedenini bilmek isterim. – VFein

5

Buradaki sorun, genellikle kullanıcı denetimlerinin yükleme mekaniği nedeniyle oluşur, genellikle sayfadan sonra yüklenir. Sonuç olarak, kontroller, page_load metodu içerisindeki kullanıcı kontrolünüzde (null ref'e) henüz başlatılmamıştır. Bunun üzerinde çalışmanın bir yolu sadece usercontrol üzerinde bir özellik oluşturmak ve ayarlamak ve usercontrol'in kendi UI'sini Page_Load yöntemine dahil etmesidir. Böyle

şey:

//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

sayfanın Page_PreRender olay kodu koymak için deneyin. Senin için çalışacak.

+0

Denetimleri denetlemek için PreRender'ı kullanmayla ilgili sorun, denetimde başka denetimlerle etkileşime giren herhangi bir olay varsa, yük sırasında doldurulmadıkça veriler eksik olacaktır. Yüklemelerinizi yükleme sırasında doldurursanız, bu verileri preRender sırasında erişilebilir kılabilirsiniz. Yükleme -> Etkinlikler Fire -> PreRender. PreRender, verilerin bayat olmadığından emin olmak için kullanılmalıdır (belki de bir etkinlik tarafından değiştirilmiş olabilir). –

+0

Sayfa.PreRender'ın sayfadan sonra oluştuğunu unutmayın.Yükleme ve Sayfadaki tüm denetimler, Sayfa gerçekleştirme işleminden önce…. Verileri kontrollere bağlamak son şanstır. –

+0

Bu benim için çalışmadı –

1

Kodda yanlış şekilde bir kullanıcı denetimi eklerken bu sorunu yaşadım. Yeni kullanamayacağınız denetimi başlatmak için Page.LoadControl yöntemini kullanmanız gerekir.

 //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); 
İlgili konular