2011-05-26 181 views
2

我在c#Express 2010編程,我在程序中有很多形式。我希望一個表單能夠以另一種形式查看變量和方法,比如Form 8可以看到並使用Form 5中定義的方法,我應該如何在表單8中定義一個類型爲form 5的對象?一個表單如何在c#中看到另一種形式的變量?表單之間的連接

感謝

+1

你應該給你的表單比「表格5」更好的名稱。 – svick 2011-05-27 00:06:43

+1

事實上,她會*有*,因爲空格不起作用。 – MusiGenesis 2011-05-27 01:11:30

回答

1

創建你所需要的共同的價值觀一類,然後傳遞形式構造函數的參數之間的類的實例。我不能創建代碼示例,因爲您沒有提到需要哪些數據元素。

+1

您甚至可以將父窗體作爲參數傳遞給子窗體構造函數,將該arg複製到子窗體變量(例如,稱爲「parentForm」),然後從parentForm訪問(公用)變量和消息。 – dar7yl 2011-05-26 23:39:42

+0

更簡單(雖然不一定更好)的方法是隻使用帶有'Owner'參數的'Show'和'ShowDialog'的重載(將'this'作爲所有者傳遞)。然後,從子窗體引用父窗體,將子窗體的「所有者」屬性轉換爲「Form1」(或任何父窗體的類型)。 – MusiGenesis 2011-05-27 01:15:45

3

您可以在這裏做兩件事情:

1)由於@Yuck建議,創建一個類,將包含你需要這兩種形式之間共享的成員,並傳遞類的實例創建一個新的時一個表格(在構造函數中,或通過財產等)

2)的情況下創建一個靜態類,將有這樣一個地方,這兩種形式可以訪問所需的字段,然後,你就可以要做:

Information.Field1 
Information.Field2 
Information.Method1() 

假設類別爲Information,某些屬性爲Field1Field2和方法Method1()

當然,第二個選項是無法實現的,因爲它可以依靠非靜態字段等

編輯:
另一個要考慮的是通過一個事件內的對象。您可以使用其中一種形式創建活動,並以其他形式訂閱活動。

當然,這取決於你需要做什麼,但這3個是在兩種形式之間共享對象的有效選項。

1

這聽起來不像是一個非常好的設計。爲了您的問題,您可以在實例化form2時通過構造函數將form1的實例傳遞給form2,然後form2將可以訪問form1的所有公共字段。告訴我們更多關於你想要做什麼的問題,可能有更好的方法,而不必傳遞你的表單及其數據的實例。

+0

謝謝!我有一個計算風險的程序,所以我在form1和form2中有其他問題,我想在form2的文本框中添加問題答案的結果,有時form2需要使用form1中的方法,有什麼幫助? – Sarah 2011-05-26 23:59:15

+1

創建一個單獨的靜態類,它存儲所有表單問題的答案。這樣您就可以將數據存儲從用戶界面中分離出來,任何需要訪問的類都只需要引用存儲數據的靜態類即可。其他用戶已經在這裏提出了這個答案,它似乎是解決您的問題的最佳解決方案。 – alexD 2011-05-27 00:06:17

0

您不需要創建一個新的類來保存共享(全局)值。您可以簡單地將這些值定義爲任何形式的屬性(使用適當的getter和setter),並將它們稱爲SomeFormOrAnother.ThisProperty。這比簡單地將表單變量本身公開。

請注意,對於一個複雜的應用來說,這可能不是最好的設計,但對於相對簡單的事情來說,它是快速有效的。

+0

嗯..如果他有Form1和Form2,他想顯示Form2並使用Form1中的一些屬性......他應該怎麼做?我的意思是,他必須將Form1實例傳遞給Form2,或者以某種方式將Form2引用到它們的父級(如果使用ShowDialog()或類似的方式顯示)。 – 2011-05-27 01:41:49

0

有很多不同的方式來處理表單之間的通信。既然你把它描述成一個類似的問卷,我會假設第二種形式是你模式地展示的形式(意思是說當你打開時你不能點擊下面的形式),你在其中收集了一些與功能相關的形式並將它們全部添加到主表單中,以更簡單的格式顯示。在按鈕點擊方法

假設你正在展示從按鈕單擊第二個形式,把這樣的代碼:

using (ChildForm child = new ChildForm()) 
{ 
    child.ShowDialog(this); // the "this" is important, since it lets 
          // the child reference the parent form in 
          // a simple way 

    // the code here will block (or stop) on the above line until the user 
    // closes the form. Then you can still reference the child's properties, 
    // even though it's no longer visible. 
    string something = child.something; 
} 

爲了使子窗體的something屬性可見,聲明它作爲public子窗體,像這樣:

public string something = String.Empty; 

根據許多,這是錯誤的 - 你應該讓something入店這樣的:

private string _something = String.Empty; 
public string something 
{ 
    get 
    { 
     return _something; 
    } 
} 

我會把這個辯論留給別人。在你的孩子的形式,當你需要查閱到的方法在父窗體(你做任何這樣的方法public),你做這樣的:

ParentForm parent = (ParentForm)this.Owner; 
int someValueOrOther = parent.callSomePublicMethod(); 
1

使用Application.OpenForms讓所有打開的窗體您的應用程序 然後遍歷它像

foreach (var frm in Application.OpenForms) 
     { 
      if (frm.GetType() == typeof(Form2)) 
      { 
       (frm as Form2).Method1(); 
      } 

     } 

您可以訪問每個窗體和鑄造它原來的類型,你可以使用公共變量,這種形式的方法。