none
如何建立相同檔名的Win form? RRS feed

  • 問題

  • 在Visual Studio 2008裡,win form建立在不同的資料夾內,vs會處理路徑問題,例如form1在專案目錄下,form2在專案的子目錄下,顯示表單都是物件.show().

    想請教賢拜先進,如果表單很多,又有相近性質,為了維護方便分別放在不同資料夾,如何讓表單以路徑識別而有有相同物件名稱?例如folder1有form1,form2,folder2也有form1.form2?因為以物件名稱識別的話這會變成重複,vs也不允許建立,但實際作業又有這個需求.

    懇請不吝指點迷津,感激不盡.

    2012年6月22日 下午 10:24

解答

  • 我得老實講, 這個改法在 Visual Basic 是還滿麻煩的, 因為你要改兩個檔. 以下為步驟 (請先點選方案總管上方的 "顯示所有檔案"

    (1) 假設你專案中已經存在一個 Form1

    (2) 在方案總管中為這個專案加一個新的目錄 Test

    (3) 在方案總管中選 Test 目錄, 按滑鼠右鍵 --> 加入 --> Windows Form

    (4) 然後你會發現要用 "Form1" 這名字是不可能的, 所以我們改成 Form1_1

    (5) 在方案總管中把它展開 (如圖)

    (6) 點開 Form1_1.Designer.vb, 你會看到以下程式碼

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class Form1_1
        Inherits System.Windows.Forms.Form
    
        'Form 覆寫 Dispose 以清除元件清單。
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        '為 Windows Form 設計工具的必要項
        Private components As System.ComponentModel.IContainer
    
        '注意: 以下為 Windows Form 設計工具所需的程序
        '可以使用 Windows Form 設計工具進行修改。
        '請不要使用程式碼編輯器進行修改。
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            components = New System.ComponentModel.Container
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.Text = "Form1_1"
        End Sub
    End Class

    為這程式碼加上自訂的命名空間 Test

    Namespace test ''開頭
    
    	<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    	Partial Class Form1_1
    		Inherits System.Windows.Forms.Form
    
    		'Form 覆寫 Dispose 以清除元件清單。
    		<System.Diagnostics.DebuggerNonUserCode()> _
    		Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    			Try
    				If disposing AndAlso components IsNot Nothing Then
    					components.Dispose()
    				End If
    			Finally
    				MyBase.Dispose(disposing)
    			End Try
    		End Sub
    
    		'為 Windows Form 設計工具的必要項
    		Private components As System.ComponentModel.IContainer
    
    		'注意: 以下為 Windows Form 設計工具所需的程序
    		'可以使用 Windows Form 設計工具進行修改。
    		'請不要使用程式碼編輯器進行修改。
    		<System.Diagnostics.DebuggerStepThrough()> _
    		Private Sub InitializeComponent()
    			components = New System.ComponentModel.Container
    			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    			Me.Text = "Form1_1"
    		End Sub
    	End Class
    
    End Namespace ''結尾
    


    (7) 打開 Form1_1.vb 程式碼

    Public Class Form1_1
    
    End Class

    一樣為它加入自訂的命名空間

    Namespace test ''開頭
    
    	Public Class Form1_1
    
    	End Class
    
    End Namespace ''結尾
    

    (8) 回到方案管理員將檔名從 Form1_1 改為 Form1

    (9) 再回到剛剛那兩個程式碼

    將 Class Form1_1 改為 Class Form1

    (10) 所以你在其它地方就得這樣宣告, 表示為 test 命名空間中的 Form1 類別

    	Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
    		Dim popForm As New test.Form1
    		popForm.Show()
    	End Sub

    (其它)

    (1) 看文章要花時間想像, 我們可以把 name space 和 class 的關係用 "中正路" 來解釋, 台灣到處都有中正路 (比喻為類別) , 所以當你在板橋 (板橋此時被比喻為命名空間) 的時候, 你問人說:『中正路怎麼走?』, 依據預設命名空間為板橋的原則 (因為你正在板橋), 所以路人會報你怎麼到板橋區中正路. 那如果你在板橋要去中和中正路, 你一定會問:『中和的中正路怎麼走?』(你指名要中和這個命名空間的中正路這個類別) , 這就是不同命名空間的比喻.

    (2) 發問沒啥好壓力不壓力的, 只要你問的是有條理的, 讓人覺得你有努力過的, 只是少了這麼一點訣竅, 大家都會願意幫助你的.

    (3) 關於 Designer.vb 是怎麼回事,  你可以參考以下文章

    Windows Form Designer


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 a670334 2012年6月25日 上午 08:39
    2012年6月25日 上午 05:29
    版主

所有回覆

  • 你可以用命名空間來切。

    但這是命名規則的問題,如果公司有規定就照規定走。如果沒有,就參考網路上的一些命名空間的分享,然後試著建立自己的命名規則吧。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年6月23日 上午 12:56
    版主
  • 有關命名規則可以參考小朱版主的這篇文章,其中有詳盡的說明。

    http://www.dotblogs.com.tw/regionbbs/archive/2009/09/06/codingstandards.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年6月23日 上午 01:12
  • 我覺得應該解釋一下在同一個命名空間, 為什麼連建立都不行的原因.

    因為當你在建立一個 Form 的時候, 就是等於在建立一個繼承 Form 類別的一個新類別, 而在同一個命名空間中是不允許有兩個類別擁有相同名稱的, 所以這已經不是路徑與檔名的問題了. 還有一個你該知道的是, 檔名和內部的類別名稱只是預設相同, 但未必一定要相同.

    以下兩篇 MSDN 文件, 你可以參考一下.

    [Visual Basic 中的命名空間]

    [Visual Basic 中的物件和類別]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年6月23日 上午 01:52
    版主
  • Bill Chnug 老師

    經您指點,小弟才了解為什麼無法建立相同名稱的Form,即使是不同目錄.

    感謝您.

    小朱老師提出方向是命名空間問題,慚愧,此時小弟才去了解什麼是命名空間,但仍懵懵懂懂.在Form1建立TextBox1,Form2建立TextBox1,兩個都叫TextBox1,編譯器能辨識,因為這兩個同名的控制項分屬兩個不同的Form,那如果我想讓一個Form1屬於Folder1,一個Form1屬於Folder2,在設計階段不知如何辦到?因為這樣做是為了找檔案方便,如果是執行階段處理,一來我的程度太低(小朱老師的大作我大部分是看不懂的),二來Form要程式執行才產生,設計階段時根本還沒發生,視覺上就不會出現在vs2008的檔案總管,那就失去我原始為了找檔案方便的動機了.

    可不可讓Folder也成為一個物件?讓在Folder下的檔案成為該Folder物件的子物件?這樣例如Folder1.Form1.Show()直接呼叫Folder1裡的Forml?

    2012年6月23日 下午 12:20
  • 一般來說,在專案中新增資料夾時,Visual Studio 會幫你做命名空間的區分。

    同一個 Form1,在 namespace Application1 和 namespace Application1.Forms 不同。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年6月23日 下午 12:56
    版主
  • To a670334:

    可否請問你平常用 Visual Basic 還是 C# ,  如果是 C# 則會像小朱講的那樣, 自動新增 NameSpace , 如果是 Visual Basic 則不會.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月23日 下午 02:50
    版主
  • 感謝小朱老師和Bill Chung老師

    小弟使用的是Visual Basic.

    剛剛實際測一下,在專案中建立一個資料夾,就直接增加一個資夾,沒有什麼額外的過程,目前看來只能擱下這個想法.

    2012年6月24日 上午 09:06
  • 我前面不是回了, 小朱說的這個只有 C# 才有, 如果你是 Visual Basic , 要自己改 name space


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月24日 上午 09:19
    版主
  • 如果只是相同檔名,類別名不同,是沒關係的... 不過你應該是要類別名相同吧...

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月24日 下午 12:14
  • 我前面不是回了, 小朱說的這個只有 C# 才有, 如果你是 Visual Basic , 要自己改 name space


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    不好意思,請問是在設計階段改嗎?在哪裡改?

    您提供的兩篇教學小弟有閱讀,不過大部分是看不懂.

    老實說,程度太低來貴論壇發問心理壓力很大,因為各位老師說的,小弟多半看不懂,但只要看得懂的,即使是老師們輕輕點一下,小弟都覺得突破瓶頸,學到很重要的東西.

    心冷熱情熄老師,感謝您指點,但實在不好意思地,我真的看不懂.

    • 已標示為解答 a670334 2012年6月25日 上午 08:38
    • 已取消標示為解答 a670334 2012年6月25日 上午 08:38
    2012年6月25日 上午 05:05
  • 我得老實講, 這個改法在 Visual Basic 是還滿麻煩的, 因為你要改兩個檔. 以下為步驟 (請先點選方案總管上方的 "顯示所有檔案"

    (1) 假設你專案中已經存在一個 Form1

    (2) 在方案總管中為這個專案加一個新的目錄 Test

    (3) 在方案總管中選 Test 目錄, 按滑鼠右鍵 --> 加入 --> Windows Form

    (4) 然後你會發現要用 "Form1" 這名字是不可能的, 所以我們改成 Form1_1

    (5) 在方案總管中把它展開 (如圖)

    (6) 點開 Form1_1.Designer.vb, 你會看到以下程式碼

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class Form1_1
        Inherits System.Windows.Forms.Form
    
        'Form 覆寫 Dispose 以清除元件清單。
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        '為 Windows Form 設計工具的必要項
        Private components As System.ComponentModel.IContainer
    
        '注意: 以下為 Windows Form 設計工具所需的程序
        '可以使用 Windows Form 設計工具進行修改。
        '請不要使用程式碼編輯器進行修改。
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            components = New System.ComponentModel.Container
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.Text = "Form1_1"
        End Sub
    End Class

    為這程式碼加上自訂的命名空間 Test

    Namespace test ''開頭
    
    	<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    	Partial Class Form1_1
    		Inherits System.Windows.Forms.Form
    
    		'Form 覆寫 Dispose 以清除元件清單。
    		<System.Diagnostics.DebuggerNonUserCode()> _
    		Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    			Try
    				If disposing AndAlso components IsNot Nothing Then
    					components.Dispose()
    				End If
    			Finally
    				MyBase.Dispose(disposing)
    			End Try
    		End Sub
    
    		'為 Windows Form 設計工具的必要項
    		Private components As System.ComponentModel.IContainer
    
    		'注意: 以下為 Windows Form 設計工具所需的程序
    		'可以使用 Windows Form 設計工具進行修改。
    		'請不要使用程式碼編輯器進行修改。
    		<System.Diagnostics.DebuggerStepThrough()> _
    		Private Sub InitializeComponent()
    			components = New System.ComponentModel.Container
    			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    			Me.Text = "Form1_1"
    		End Sub
    	End Class
    
    End Namespace ''結尾
    


    (7) 打開 Form1_1.vb 程式碼

    Public Class Form1_1
    
    End Class

    一樣為它加入自訂的命名空間

    Namespace test ''開頭
    
    	Public Class Form1_1
    
    	End Class
    
    End Namespace ''結尾
    

    (8) 回到方案管理員將檔名從 Form1_1 改為 Form1

    (9) 再回到剛剛那兩個程式碼

    將 Class Form1_1 改為 Class Form1

    (10) 所以你在其它地方就得這樣宣告, 表示為 test 命名空間中的 Form1 類別

    	Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
    		Dim popForm As New test.Form1
    		popForm.Show()
    	End Sub

    (其它)

    (1) 看文章要花時間想像, 我們可以把 name space 和 class 的關係用 "中正路" 來解釋, 台灣到處都有中正路 (比喻為類別) , 所以當你在板橋 (板橋此時被比喻為命名空間) 的時候, 你問人說:『中正路怎麼走?』, 依據預設命名空間為板橋的原則 (因為你正在板橋), 所以路人會報你怎麼到板橋區中正路. 那如果你在板橋要去中和中正路, 你一定會問:『中和的中正路怎麼走?』(你指名要中和這個命名空間的中正路這個類別) , 這就是不同命名空間的比喻.

    (2) 發問沒啥好壓力不壓力的, 只要你問的是有條理的, 讓人覺得你有努力過的, 只是少了這麼一點訣竅, 大家都會願意幫助你的.

    (3) 關於 Designer.vb 是怎麼回事,  你可以參考以下文章

    Windows Form Designer


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 a670334 2012年6月25日 上午 08:39
    2012年6月25日 上午 05:29
    版主
  • TO:Bill Chung老師

    小弟照著做,以test.Form1.Show()呼叫出子目錄內的Form1.

    言謝不足表達心中之情,耗費您那麼多時間很過意不去.您對於相對路徑的詳盡解釋,小弟明白了.看過MSDN對於NameSpace的教學不甚了了,經您教導實作才知道如何應用.

    感謝各位老師指點,小弟受益良多.

    2012年6月25日 上午 08:02