2011-09-04 75 views
0

我一直在研究MVC和MVP,但我不確定它們是我想要的。如何響應一個大的Form1.cs?

我現在有很多模型對象和我的看法是主要形式(Form1.cs的)

的問題是主要的形式變得非常大了。例如,當用戶點擊撤消菜單項時,調用undoButton_Click事件處理程序。這可以。問題是這個事件處理程序中的代碼是10行(彈出undoStack,推動redoStack,更新表單控件等等)。這聽起來可能不是很多,但是當表單上有很多控件時,這些線條很快會加起來。

我一直在想它,我想要一個簡單的解決方案。理想情況下,當調用undoButton_Click時,方法體將是一行代碼。理想情況下,會有一個類(可能來自定義單個Run方法的接口或類似的東西),我可以調用它來執行此撤消操作。

的問題是,undoButton_Click許多表單控件和所述類的成員變量進行操作。這個班級如何獲得這些控制?我無法將表單作爲參數傳遞,因爲所有控件都是私有的。我真的不想讓所有的控制公開或提供大量的公共財產來訪問它們。即使我做了Form1的那些成員變量如何使用undoStack或文檔對象?

這是完全不可行的通過所有需要的參數,因爲paramater名單將是巨大的,如果變化將永遠需要進行這將是一場噩夢。

不太確定如何解決這個問題。但我所知道的是,我的Form1.cs對於對象的邏輯和操作太混亂了。我只想讓它響應事件並調用相應的方法/類來處理事件。

感謝您的閱讀和對文本牆的抱歉。

+0

你能不只是突破的形式進入小控件或部分觀點? – TheCodeKing

回答

0

我不太明白你的代碼是該做的,但你應該單獨代碼,其有一個簡短的代碼,做一些各自的具體行動更小的方法。當你達到這個水平時,你會看到哪些可以用於控制幾個控件,哪些僅適用於一個控件。此外,你會看到他們每個人都需要什麼參數,然後你會得到一個線索,他們中的哪一個可以在一個單獨的類中,並且可以作爲一個控制的私有方法,並且需要一個私有的專用方法領域。 祝你好運,成功。

1

我有一個非常類似的問題。我的解決方案是爲我的MainForm創建部分類。我有一個事件處理程序,一個用於鼠標處理,一個用於鍵盤處理等。

我也重構了一些,它們會在許多地方使用到一個單獨的靜態類的實用方法。

我也有用於跨項目使用的字段另一部分類。最後,我對某些字段和屬性使用靜態類來減少傳遞參數到方法。我相信有些人會告訴我這是不好的做法,但它適用於我。

最後,我用一個插件到Visual Studio計算的代碼的複雜性和可維護性,然後重構那些大型或複雜的成更小的方法。

+0

這就是我正在談論的,但總之和清晰的短語。對你有好處! :-) – Seffix

0

我想補充ControlUndo類構造函數

ControlUndo(Form parentform, string controlname, string property)

表單上的每個control都通過傳遞其父窗體,其名稱和屬性名稱來聲明其可撤銷屬性。

ControlUndo有一個方法Undo()Controls收集母體形式的發現一個Control對象,使用反射找到一個屬性來撤消和恢復的值。

新的ControlUndo被添加到可撤銷對象的全局集合。當您調用表單上的Undo時,您只需爲集合中的每個元素調用Undo()

UI呢?

如果您在窗體上有很多控件,那麼user幾乎不可能在同一時間全部使用它們。因此,根據您的應用邏輯,您可以將它們放在不同的TabPages之間,方法是將所有控件放置在表單上,​​但限制UI用戶在該時刻需要的最重要內容。

希望這會有所幫助。

0

你應該嘗試從你的UI層中刪除儘可能多的邏輯。當您需要執行業務邏輯時,該邏輯應位於業務層中。 UI應該只知道如何直觀地表示各種數據,並向您的業務層發出命令。你不需要使用MVC來實現這一點。

從概念上講,考慮一個Person類。這將有一組屬性(名稱,地址,狗的名字)。您的用戶界面將擁有一組文本框,以及對其代表的個人實例的引用。當對文本框進行更改時,更改將應用​​於人員實例。當你想撤消時,你可以調用undo對象來完成,並且該對象將恢復到之前的狀態(並允許重新執行)。撤消完成後,用戶界面會將新值放入文本框中,但不應該在意如何執行實際撤銷或重做。

這可以通過手動實現,或者使用.NET中的內置數據綁定機制來實現。我的主要觀點是,儘可能將你的邏輯從你的UI中分離出來,而Form只會在屏幕上顯示內容併發出命令。無論何時SQL語句或計算開始出現在按鈕的點擊處理程序中,您都處於錯誤的軌道上。

在撤銷的具體的例子,你應該看看紀念品設計模式(herehere

相關問題