2011-07-20 64 views
4
啓用禁用控件

有誰知道根據上下文獲取啓用/禁用窗體上的控件的正確方法嗎?問題是,我的窗體上有大約50個控件,它們的狀態應該取決於某些列表中選定的項目,選中的複選框以及數據庫中的某些數據是否存在。Windows窗體,根據

非常粗略的例子是當你有一個多選樹視圖和像「比較」按鈕。只有當您在樹視圖中選擇的節點都是相同類型時才應啓用此按鈕。此外,還有一個額外的要求是,只有選擇2個節點時才能啓用。還有一點,並不是每個班級都可以進行比較,所以您應該選擇什麼來進行比較也有限制。

問題不在於Control.Enabled = true/false。問題是關於通用方法。

謝謝。

+0

我想如果你有這樣複雜的規則,你可能不得不手動去做。 – Ian

回答

1

在WPF中,有一種叫做Visual State Manager的東西。你可以在WinForms中實現類似的東西。基本上你的表單可能有狀態,並且只能在狀態中允許控制修改。然後你調用一個轉換來改變狀態。至少所有的修改代碼都可能被州政府經理調用的某個地方的方法鬆動。

http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx

在WPF我覺得有某種設計師的支持。在WinForms中,可能會出現類似於本地化如何在表單上工作的情況,但它涉及到了。

我爲一個項目做了一個原始狀態管理器,該項目將字符串狀態名稱和相應的委託列表用於要調用的方法,然後將所有修改代碼保留在方法中而不是修飾有關窗體。

+0

我正在考慮將表單視爲一組功能並以狀態模式方式實現每個功能。像ICompareItemsFeature,IAddItemFeature等等。通過控制事件處理程序,我將執行轉換。 – agibalov

1

我不知道如何幫助的,這可能是你的,但對我來說,當如此多的控件需要承擔有限/受限組條件的動作,然後我的方法是:

  1. 禁用所有控件都是默認的,只有滿足使用條件時才能啓用。這可以確保用戶獲得他們何時可以使用控件的視覺提示,但是需要更多的工作,因爲它要求我們檢查條件何時丟失,以便可以再次禁用控件。

  2. 默認情況下,所有控件都已啓用/可用,但僅在符合所需條件時才採取操作/響應用戶操作。

但是就像你可能會告訴,這些方法可能不能一概而論好,你可能需要實施某種模式/接口,觀察代表控制的動作/上下文,然後把它們開/關當正確的條件得到滿足時。

1

另一個想法可能是:就是讓每一個需要的狀態管理器AsbtractControl類,這意味着在每一個孩子的控制定義它的具體通知狀態

在您的應用程序實現eventmanager進行是「掛鉤」事件從不同的控制收到,投他們像AsbtractControl並推動StateStack由剛剛被用戶「激活」控制所隱含的狀態。

實施DesitionalEngine是解析上的每一個動作StateStack和啓用/禁用的UI控件,並清除/或基於由desition不能疊加。正如你所說的,原因是啓用/禁用也可以基於多個控制動作完成。

只是爲了給你另一個想法,導致與我幾年前爲WinForms實現的類似。

希望這會有所幫助。

問候。

0

我有一個解決方案來解決上述問題,如果我們正在使用對象模型,那麼它將很容易維護所有控件的狀態。