2010-11-30 37 views
3

我想爲表單創建一個部分類。我有很多事件,並且它變得很混亂,所以我想將各個部分分解成他們自己的文件。爲表單創建部分類

的問題:當我創建了一個局部類我的形式,說:

Partial Public Class Form1 

End Class 

Visual Studio的決定,我需要另一種形式爲這個部分類。

問題:
1.如何爲表單創建部分類?
2.如果我不能這樣做,我怎樣才能將我的表單中的所有事件分解成不同的文件?

回答

4

是的,它的確如此。只要你放棄了這個幻象形式的控件,你就會得到在該源代碼文件中生成的設計時代碼(InitializeComponent)。這是.NET 1.x的兼容性行爲,它不支持Partial關鍵字。這將打破構建,現在有兩個。仔細點擊可以避免這種情況,但您知道遲早會發生。

其他的東西也出錯了,當你從一個文件移動到另一個文件時,設計者不能再跟蹤事件處理程序。並會隨時讓你添加另一個更棘手的錯誤來源。

這只是行不通,放棄依靠它來解決你的問題的希望。

通用診斷是令人費解的用戶界面產生令人費解的代碼。但是那艘船已經航行了,毫無疑問。一個更加結構化的解決方案是追求MVC模型,從數據的角度分離數據。你仍然會有很多事件處理程序,但除了調用實際工作的類的方法之外,它們不會做任何事情。誰的源代碼當然可以存在於另一個源代碼文件中。典型的掛斷是Windows窗體沒有任何內置的支持,你必須手工製作。沒有什麼類似於WPF中的MVVM模型。

可以可以很好地工作是隔離控制+代碼到一個單獨的UserControl。儘管如此,你必須小心翼翼地做到這一點,你不需要添加一大堆暴露內部控制的屬性和事件。

+1

,所以我不能使用部分與形式的類。遊民。是的,表單中有大量的用戶控件,但它們分成幾個選項卡。也許我可以將每個標籤移動到它自己的形式。這聽起來像我已經在遵循MVC模型。你能擴展最後一段關於用戶控制的內容嗎? – 2010-11-30 18:21:10

+1

如果您已經將UserControls放在選項卡上,那麼您就不在前面。這些UCs的代碼應該已經在另一個文件中。 – 2010-11-30 18:26:45

0

不確定你的意思是「Visual Studio決定你需要另一個表單」,但是,你確定新的Form1部分類是在相應的原始名稱空間中聲明的嗎?

給定.NET類型的所有部分類必須在相同的名稱空間中聲明(無論它們存儲在哪個文件中)。

0

雖然它不回答原來的問題,但我發現使用regions使我的代碼更容易管理/可讀。

#Region "RegionA" 

#End Region 

我orginally稱這種方法是 「黑客」,因而下面的評論。

1

有時我會創建部分類以獲得更好的可讀性,特別是當我有很大的類時。 但是,當我點擊部分類時,VS IDE將打開窗體編輯器,向我展示一個空表單。如果我不在乎,比我可能會損壞的主要形式(這似乎是VS 2008/2010的一個bug)

一種可能性可以使用DesignerCategoryAttribute Class

馬克與屬性「代碼」局部類。

<System.ComponentModel.DesignerCategory("code")> 
Partial Class Form1 

End Class 

通過這種方式,當您單擊該文件時,可以在代碼編輯器中打開該類。 當然,這將適用於所有文件,也適用於主窗體文件。 如果你想在表單編輯器重新編輯表單,你要引用屬性:

'<System.ComponentModel.DesignerCategory("code")> 

更多的細節here

0

我很欣賞漢斯給出的答案,我根本不反對這些。不過,在Visual Studio 2010中,當你創建一個名爲say Main的窗體時,你會得到一個Main.designer.vb,它是一個部分類。它在頂部說'部分類主'。點擊此類時不會打開表單。它還包括對事件處理程序的引用。所以我想知道他們如何解決這個問題?有沒有辦法創建這些「特殊」部分類之一,我們可以期待。

我注意到當我創建一個Form Partial類時,圖標從一個類圖標變成了一個表單圖標。與Main.designer.vb文件關聯的圖標看起來像帶箭頭的類圖標。

0

什麼工作對我來說(VS 2010)爲命名Form1類,已保存在Form1.vb的有自己的設計師(Form1.Designer.vb)爲:

Public Class Main 'saved in Form1.vb 

VS在設計更新的名稱如:

Partial Class Main 'saved in Form1.Designer.vb 

然後我創建了另一個 「局部類」 具有相同的名稱:

Partial Class Main 'saved in Main.vb 

無論我編輯Form1.vb或Main.vb VS顯示我頂部導航平臺上的所有例程,函數,潛艇,甚至是後臺工作人員和計時器。對於事件處理程序,以避免前面提到的漏洞(你在佈局設計和全新的事件處理程序的控制單擊將在原有Form1.vb的創建)我去:

Partial Public Class Main 'in Form1.vb file 
    Private Sub SomeControl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SomeControl.Click 
     Call SomeControlClick(sender, e) 
    End Sub 
End Class 

Partial Public Class Main 'then in Main.vb file 
    Private Sub SomeControlClick(ByVal sender As Object, ByVal e As System.EventArgs) 
     'blah blah 
    End Sub 
End Class