2011-08-13 28 views
3

目前我在大約10控件事件處理程序中,我有這樣的代碼:如何在條件滿足之前禁用控件?

 if (!mapLoaded) 
      return; 

當我加載通過我設置mapLoaded到真正的打開文件對話框的地圖。另一種方法是僅僅禁用啓動時的所有控件,並在加載地圖後啓用所有控件。不幸的是30+的控制而這僅僅是30行..

a.Enabled = true; 
b.Enabled = true; 
c.Enabled = true; 

我真的不能做到通過this.Controls foreach循環或者是因爲一些控制是項目的MenuStrip,工具條項目,面板項目,滾動條,分離器等等,並且該循環不包括那個。

理想情況下,會有一種方法可以在單個簡單循環中將每個控件的啓用屬性設置爲true,但我不確定如何執行此操作。有什麼想法嗎?

回答

7

使用數據綁定:

  1. 變化mapLoaded成當其值改變通知觀察者的屬性...您的控件Enabled財產

    public bool MapLoaded 
    { 
        get 
        { 
         return mapLoaded; 
        } 
        set 
        { 
         if (value != mapLoaded) 
         { 
          mapLoaded = value; 
          MapLoadedChanged(this, EventArgs.Empty); 
         } 
        } 
    } 
    private bool mapLoaded; 
    
    public event EventHandler MapLoadedChanged = delegate {}; 
    //^or implement INotifyPropertyChanged instead 
    
  2. 數據綁定MapLoaded。您可以使用Windows窗體設計器或使用代碼來設置數據綁定。右InitializeComponent();後:

    a.DataBindings.Add("Enabled", this, "MapLoaded"); 
    b.DataBindings.Add("Enabled", this, "MapLoaded"); 
    c.DataBindings.Add("Enabled", this, "MapLoaded"); 
    
+0

這就是我正在尋找的。我會試試看。謝謝! –

+0

你說你可以使用Windows窗體設計器設置數據綁定。那個選項在哪裏?選擇控件時,在屬性窗口中看不到Bindings或DataBindings屬性。 –

+0

@John,這通常涉及四個步驟(在VS2010中):** 1。**向項目添加一個新的對象數據源;在這種情況下,您可以將「Form」類自身添加爲數據源。您可能必須先編譯該項目,以便可以在* Add Data Source *嚮導中看到「Form」類。 ** 2。**將一個'BindingSource'組件添加到您的表單中併爲其選擇'Form'對象數據源。 ** 3。**在Form的構造函數中,設置'formBindingSource.DataSource = this;'。 ** 4。**在任何控件的*屬性*中使用* Advanced Bindings *嚮導來定義數據綁定。 – stakx

2

如何改變你的開放戰略,有一種新的形式,讓一個之前已加載的用戶加載地圖,並且根本就沒有加載您的主要形式?

+0

這是一個體面的建議,但我更喜歡stakx的解決方案。儘管如此。 –