2011-08-24 18 views
5

Obecnie większość elementów sterujących formularza jest wyłączona podczas uruchamiania, ponieważ nie można ich używać, dopóki plik nie zostanie załadowany. Jednak po wczytaniu pliku kontrolki powinny zostać włączone.Jak włączyć WSZYSTKIE kontrole w formularzu?

Używałem wiązań, ale nie sądzę, że są dobrym rozwiązaniem. Po pierwsze, jest to niepotrzebna złożoność. Po drugie, nie możesz używać wiązań do wszystkiego. Na przykład elementy MenuStrip nie mogą mieć przypisanej właściwości Enabled do właściwości fileLoaded. Tylko całe menu może i nie chcę wyłączyć całego menu podczas uruchamiania, tylko niektóre operacje menu, które działają na pliku.

Naprawdę tylko szukam sposobu, aby umożliwić WSZYSTKO. Większość pytany, która odpowie tak:

foreach (Control c in Controls) 
{ 
    c.Enabled = true; 
} 

jednak, że nie działa w celu umożliwienia przedmioty MenuStrip lub kontroli w ramach innych kontroli (jak Panelu sterowania lub niestandardowych). W związku z tym nie można włączyć pasków przewijania w kontenerach.

Przypuszczam, że mogłem użyć tej linii i ręcznie włączyć wszystko inne, ale zawsze mogłem ręcznie ustawić tylko . Szukam sposobu automatycznego włączenia wszystkiego.

+0

Jak te elementy zostały wyłączone w pierwszej kolejności? Być może możesz śledzić, co zostało wyłączone na liście, a następnie ponownie włączyć wszystkie elementy z tej listy (i wyczyścić ją). –

+0

Są one wyłączone w projektancie formularzy. Większość narzędzi aplikacji nie może być użyta bez załadowanego pliku, dlatego domyślnie są one wyłączone. –

Odpowiedz

11

Recursion

private void enableControls(Control.ControlCollection Controls) 
{ 
    foreach (Control c in Controls) 
    { 
     c.Enabled = true; 
     if (c is MenuStrip) 
     { 
      foreach(var item in ((MenuStrip)c).Items) 
      { 
       item.Enabled = true; 
      } 
     } 
     if (c.ControlCollection.Count > 0) 
      enableControls(c.Controls); 

    } 
} 

Edit

powinno było sprawdzenie liczyć Collection kontrola zamiast HasControls Który Webcontrols

+0

Dzięki, to działa dobrze. Jednak nadal nie umożliwia włączania elementów MenuStrip. Przypuszczam, że mógłbym ręcznie je włączyć, ale zastanawiam się, czy istnieje sposób na dołączenie ich do tej pętli? –

+0

Tak, możemy to zrobić – msarchet

+0

@JohnSmith sprawdź edycję dla menustrip – msarchet

2

Wykonaj:

var Enable = (Control c) => 
      { 
       c.Enabled = true; 
       if(c.Controls != null) 
        foreach(Control c2 in c.Controls) 
         Enable(c2); 
      } 

Enable(YourForm); 
+0

To tylko w dół 1 poziom – msarchet

+0

@msarchet: nie, nie, jego rekursywna – Dani

+0

nieodebranych połączenia i przeczytaj go jako c2.enable – msarchet

1

rekurencyjnie iteracji nad Twoje menu jest konieczne, aby wyłączyć każdy element w menu. Istnieje jednak prostsze rozwiązanie dla wszystkich formantów formularzy - umieść je w panelu obejmującym cały formularz i wyłącz formularz w programie VS Designer. Kiedy twój użytkownik wybierze plik, włącz panel i altówkę! Nie jest wymagana dodatkowa rekursja (lub narzut).

Jeśli nadal chcesz iść rekurencyjnej trasą, którą chciałbym zmienić Włącz metodę najpierw zmieniając jego nazwę na ChangeEnabledState, a po drugie, chciałbym parametrem bool, które pozwalają użyć, aby przypisać do nieruchomości Enabled. W ten sposób możesz włączyć/wyłączyć sterowanie, jeśli to konieczne. Pamiętaj jednak, że musisz dodać kontrolę, aby sprawdzić, czy kontrola jest przyciskiem (lub czymkolwiek, co kontrolujesz, aby otworzyć OpenFileDialog) jest pomijana w operacji wyłączania.

6

Połóż wszystkie elementy sterujące w panelu;

panel.enable = false -> wszystkie kontrolki w panelu zostaną wyłączone panel.enable = true -> wszystkie kontrolki w panelu będą włączone (jeśli są włączone domyślnie, krótko zapełnij panel włączonymi kontrolkami , niech panel wyłączone tak, że kontrole zostaną wyłączone, too. Po włączeniu panelu, swoje kontrole zostaną włączone)

+0

+1, to właśnie bym zrobił. – TheBlastOne

3

Dla MenuStrip rzeczy można zrobić rekursywnie, to bardzo proste. Wystarczy ustawić flagę item.Enabled na wartość true lub false.

Możesz używać mojej klasy, to tylko kilka wierszy kodu, łatwy w użyciu. Możesz także utworzyć funkcję wyszukiwania i po prostu przekazać nazwę, którą chcesz wyłączyć. Enjoy:

namespace Test_MenuItemIteration 
{ 
    using System.Collections.Generic; 
    using System.Windows.Forms; 

    public static class GetAllMenuStripItems 
    { 
     #region Methods 

     /// <summary> 
     /// Gets a list of all ToolStripMenuItems 
     /// </summary> 
     /// <param name="menuStrip">The menu strip control</param> 
     /// <returns>List of all ToolStripMenuItems</returns> 
     public static List<ToolStripMenuItem> GetItems(MenuStrip menuStrip) 
     { 
      List<ToolStripMenuItem> myItems = new List<ToolStripMenuItem>(); 
      foreach (ToolStripMenuItem i in menuStrip.Items) 
      { 
       GetMenuItems(i, myItems); 
      } 
      return myItems; 
     } 

     /// <summary> 
     /// Gets the menu items. 
     /// </summary> 
     /// <param name="item">The item.</param> 
     /// <param name="items">The items.</param> 
     private static void GetMenuItems(ToolStripMenuItem item, List<ToolStripMenuItem> items) 
     { 
      items.Add(item); 
      foreach (ToolStripItem i in item.DropDownItems) 
      { 
       if (i is ToolStripMenuItem) 
       { 
        GetMenuItems((ToolStripMenuItem)i, items); 
       } 
      } 
     } 

     #endregion Methods 
    } 
} 

wykorzystania w aplikacji:

List<ToolStripMenuItem> myItems = GetAllMenuStripItems.GetItems(this.menuStrip1); 
foreach (var item in myItems) 
{ 
    MessageBox.Show(item.Text); 
    item.Enabled = false; 
} 
Powiązane problemy