2012-11-19 8 views
9

Formumun yüzlerce kontrolü var: menüler, paneller, ayırıcılar, etiketler, metin kutuları, adını verin.Bir düğme dışındaki formdaki tüm denetimler nasıl devre dışı bırakılır?

Tek bir düğme dışında her denetimi devre dışı bırakmanın bir yolu var mı?

Düğmenin neden önemli olmasının nedeni, pencereyi veya bir şeyi devre dışı bırakan bir yöntemi kullanamamaktır çünkü bir denetimin hala kullanılabilir olması gerektiğinden.

+1

Düğmeyi ayrı bir biçimde koymalı mıyım? – SLaks

+0

Yalnızca formdaki tüm denetimler arasında geçiş yapamazsınız, her birinde Enabled özelliğini ayarlıyor musunuz? Kendi döngüsünde, kimliğini/adını kullanarak düğmeyi yoksayın. Ya da devam edin ve döngüdeki her şeyi devre dışı bırakın, hemen ardından düğmeyi etkinleştirin. –

cevap

21

İlgili tüm denetimleri devre dışı bırakmak için özyinelemeli bir çağrı yapabilirsiniz. Sonra düğmenizi ve herhangi bir ana kapsayıcınızı etkinleştirmeniz gerekir. sürdürmek kolay olurdu daha iyi, daha düzenli bir çözüm için

private void Form1_Load(object sender, EventArgs e) { 
     DisableControls(this); 
     EnableControls(Button1); 
    } 

    private void DisableControls(Control con) { 
     foreach (Control c in con.Controls) { 
      DisableControls(c); 
     } 
     con.Enabled = false; 
    } 

    private void EnableControls(Control con) { 
     if (con != null) { 
      con.Enabled = true; 
      EnableControls(con.Parent); 
     } 
    } 
+1

Neden ref anahtar kelimesini orada eklediniz? –

+0

Yapmazdım. Yazarken telefondaydım ve bir sebepten dolayı – pinkfloydx33

+0

Ha çıktı. Aferin. Belirli kontroller hakkında bilmediğiniz veya umursamadığınız yöntemleri nasıl yaptığınızı seviyorum. Newbies bunun gibi şeyleri gözden kaçırıyor. –

8

- muhtemelen diğer kontrollerden kenara düğme koymak gibi, tasarımınızı yeniden gözden geçirmek gerekir. Daha sonra diğer kontrollerin bir panelde veya bir grup kutusunda olduğu varsayıldığında, sadece Panel.Enabled = False yapın. @ Pinkfloydx33 cevabı ve ben üzerinde yapılan düzenleme doğrultusunda

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) 
yourButton.Enabled = True 
+1

+1.Panel.Enabled = false | true' için –

+0

+1. Bir grup kontrol oluşturmak için arayüzünüzü yeniden tasarlayın ve ardından tüm grubu devre dışı bırakmak, kullanıcı arayüzünü tasarlamak için kesinlikle daha iyi bir yoldur. – sentenza

10

, Ek süreye yarattı: Eğer gerçekten geçerli tasarımınızı tutmak istiyorsanız

, sen Linearise ControlCollection tree into array of Control aşağıdaki ardından do özyinelemeye önlemek ve yapabilirsiniz daha da kolay hale getirir yöntem, sadece böyle bir public static class oluşturun:

public static class GuiExtensionMethods 
{ 
     public static void Enable(this Control con, bool enable) 
     { 
      if (con != null) 
      { 
       foreach (Control c in con.Controls) 
       { 
        c.Enable(enable); 
       } 

       try 
       { 
        con.Invoke((MethodInvoker)(() => con.Enabled = enable)); 
       } 
       catch 
       { 
       } 
      } 
     } 
} 

Asistan vs. bir kontrol, biçim, menüler, subcontrols, etkinleştirmek veya devre dışı bırakmak için sadece yapın:

this.Enable(true); //Will enable all the controls and sub controls for this form 
this.Enable(false);//Will disable all the controls and sub controls for this form 

Button1.Enable(true); //Will enable only the Button1 

Yani, ben @ pinkfloydx33 cevabı olarak benzer ne yapardınız:

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Enable(false); 
     Button1.Enable(true); 
} 

statik ve (el) örnekleri oluşturmadan her yerde kullanabilirsiniz çünkü Uzatma yöntemleri gibi ve daha net var en azından benim için.

+0

Bu işe yaramıyor. Bunu çağırır.Enable (false); daha sonra Button1.Enable (true), sonra bu (form) ve Button1'in diğer tüm ana denetimleri hala devre dışı bırakılır. –

+0

Muhtemelen seni anlamıyorum ama bence konu bu. Düğme1'in üst öğesini etkinleştirmeniz gereken şey buysa, üst öğeyi ve tüm çocuk denetimlerini etkinleştirmelidir. – coloboxp