5

bir panel çok zaman alıcı elle geçen isimlerin bütün panelleri gizleme menü seçeneğiPencerelerdeki tüm panelleri nasıl gizlerim? Menü şeridi ve çoklu paneli konteynerlerle benim windows uygulamasında

bağlı görüntülenir, tüm panelleri veya herhangi bir şekilde gizlemek için herhangi bir yol yoktur bir formdaki tüm panellerin isimlerini almak için?

+0

Ben senin başlık düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

+0

Bir [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs.80) .aspx) döngüsünü kullanmayı mı düşündünüz? – Brian

cevap

8
foreach (Control c in this.Controls) 
{ 
    if (c is Panel) c.Visible = false; 
} 

Ve hatta yerine this.Controls kullanmanın ControlCollection bu özyinelemeli yapmak ve geçebileceği:

HidePanels(this.Controls); 

... 

private void HidePanels(ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c is Panel) 
     { 
      c.Visible = false; 
     } 

     // hide any panels this control may have 
     HidePanels(c.Controls); 
    } 
} 
+0

Ninja'ed. Bu kodu şimdi yazıyordum. Yani şimdi benim hakkım var. – Renan

+0

@Renan, çok teşekkürler dostum! Bana yumruk atmak için –

+0

+1: P – Brian

3

Onun bu

foreach (Panel p in this.Controls.OfType<Panel>()) { 
    p.Visible = false; 
} 
1

Argh gibi bir şey yazmak için temiz! Ben de sadece kodu yazıyordum! : P alternatif

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Hide(); 
} 

Veya:

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Visible = false; 
} 
+0

Kontrolün panel1, button1 içerdiğini nereden biliyorsunuz? neden yeni Kontrol [] dizisi yaratıyorsunuz, hafızası etkisiz, kötü alışkanlıkları öğrenmeye mi çalışıyorsunuz - gereksiz yere boşa harcıyorsunuz? –

+0

Daha açık olmak üzere düzenlenmiştir. Şimdi sadece cevaplarımı snarky olarak mı görüyorsun? – Brian

5

Yani muhtemelen sen sadece üst düzey kontrolleri, her yerde formdaki denetimlerin tüm almak istiyorum. Bunun için biz, belirli bir kontrol için, her düzeyde, tüm alt denetimleri almak için bu kullanışlı küçük yardımcı işlevi gerekir: Bunu kullanmak istiyorum düşünüyorsanız

public static IEnumerable<Control> GetAllControls(Control control) 
{ 
    Stack<Control> stack = new Stack<Control>(); 
    stack.Push(control); 

    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (Control child in next.Controls) 
     { 
      stack.Push(child); 
     } 
    } 
} 

(o bir uzantısı yöntemi yapmak için çekinmeyin yeterince)

Sonra da belirli bir türdeki kontrollerini almak için bu sonuca OfType kullanabilirsiniz.

var panels = GetAllControls(this).OfType<Panel>(); 
+0

Özyinelemeden ziyade bir döngü kullanmanın güzel bir yolu (böylece bir denetim hiyerarşisinin derinlerine sahip olmayı başarmış olsanız da, muhtemelen bir geri çekilmeli ve bir nefes almalısınız ...)! Tipleri genel olarak aldığınızda biraz daha iyi olabileceğini düşünüyorum. Belki de gerekli değil, hrm .... – Joshua

+0

@Joshua Bu işe yaramaz. En üst düzeyde, içinde bir panel bulunan bir kullanıcı denetimi varsa. Bu paneli istiyor musun, istemiyor musun? Eğer yaparsanız, hemen aradığınız panelleri filtreleyemezsiniz, sonunda yapmanız gerekir.Tabii ki kontrolünü geri getirmek istemiyorsanız, ve tüm ebeveynleri, belirtilen türden * hepsi *, o zaman bu farklı bir hikaye. Bu kesinlikle daha hızlı olacaktır (çok daha az kontrollere bakarsınız), ancak sonuçlar açısından da çok farklıdır. – Servy

+0

@Joshua Ayrıca, özyinelemeden kaçınmanın olası herhangi bir SO istisnasını engellemediğini, aynı zamanda genel olarak daha fazla performans gösterdiğini de unutmayın. Bir * büyük * kenar boşluğuyla değil, bir dereceye kadar. Ayrıca, hata ayıklama veya istisnalarla uğraşırken dağınık yığın izlerini de engeller. – Servy