Control.Enabled etkin "Geçersiz Kılma"

Biraz etrafına baktım ve C# WinForms 3.5'da Control.Enabled'ı etkin bir şekilde "geçersiz kılmaya" dair bir cevap bulamıyorum.

Durumumuz, altta bir durum çubuğu ve üstte araç çubuğu ekleyen, kullandığımız bir temel form veya ana formumuz olmasıdır. Bu form tüm diğer formlarımız tarafından devralınır ve ardından kontrolleri orta panele ekler.

Ana temel formdan devralınan formların bazılarında, formdaki "Enabled" özelliğini kullanabilmeyi istiyoruz, ancak yalnızca orta paneli devre dışı bırakmak ve durumu değil, fonksiyonalitesini geçersiz kılmak istiyoruz. Menü çubuğu ve böylece form etrafında hareket edebilir.

Ana formda (FrmBaseStatus) aşağıdakileri yapmaya çalıştım:

private bool enabled = true;
public new bool Enabled
{
    return this.enabled;
}
set
{
    this.enabled = value;
    this.panelBase.Enabled = value;
}

Ancak, bu kesinlikle doğru bir geçersiz kılma değildir ve eğer miras alınan formlarımızdan birinde ana panelde bir kullanıcı kontrolümüz varsa ve bu kullanıcı kontrolünden formu geçersiz kılmak istiyorsak, aşağıdaki gibi bir şey yapmak zorundayız:

((FrmBaseStatus)this.ParentForm).Enabled = true;

Bunu yapmak için başka bir yol var mı, yoksa kullanmak istediğimiz Enabled özelliğine ulaşmak için her zaman temel formumuzu kullanmamıza bağlı kaldık mı?

Not: OnEnabled olayını geçersiz kılar ve OnEnabled tabanını çağırmaz mı yoksa Control.OnEnabled() bu olayda etkinleştirme ve devre dışı bırakma mıdır?

4
Kod biraz anlam ifade etmiyor. Formu devre dışı bıraktığınızda, tüm çocuk denetimleri de devre dışı bırakılır. Paneli dahil. Çocuk kontrolleri, ebeveynlerini devre dışı bırakma işinde olmamalı olmalıdır. Bir etkinlik kullanın.
katma yazar Hans Passant, kaynak
.EnabledChanged içinde kontrollerinizi yeniden etkinleştirmeyi denediniz mi?
katma yazar Stephan B, kaynak
Sorun, "form" un kendiliğinden devre dışı bırakılamamasıdır, o zaman onu artık hareket ettiremezsiniz veya artık hiçbir şey olamaz.
katma yazar copystart, kaynak

1 cevap

Bir denetimdeki Enabled özelliği, tüm denetimi etkinleştirmek/devre dışı bırakmak için kullanılır; bu nedenle, ana formunuzdaki neden Enabled özelliğini geçersiz kılmanız gerektiğini tam olarak anlamıyorum. Tam olarak centerPanel'i devre dışı bırakmanız gerekirse, o paneli almak için bir özellik ekleyin ve devre dışı bırakın.

Temel formunuzda bir CenterPanel özelliğini tanımlamanızı ve ardından bu paneli devre dışı bırakmak için onu kullanmanızı öneririm:

// code defined in your FrmBaseStatus form
protected Control CenterPanel
{
    get
    {
        return this.panelBase;
    }
}

Sonra kalıtsal formlardan şunları kullanabilirsiniz:

// disable center panel and its childs
this.CenterPanel.Enabled = false;

//disable the whole form
this.Enabled = false;
4
katma
CenterPanel.Modifiers özelliğini, temel formun tasarımcısında Korumalı olarak ayarladığınızdan emin olun. Aksi halde, kontrolleri türetilmiş formda ekleyemezsiniz.
katma yazar djv, kaynak
Bu çok iyi bir fikir ve kullanıcı kontrolünden devre dışı bırakmak için çalışacaktı, ancak tüm kontrolleri MDI'dan alır ve bir .Enabled = false yapmak isterim, bu işe yaramaz. Ayrıca MDI, FrmBaseStatus'u bilmez çünkü MDI bir eklenti yöneticisindedir. Tüm MDI'nın görünürlüğü "Form" sınıfıdır ve daha yüksek değildir.
katma yazar copystart, kaynak