2011-03-22 60 views
2

由於某些未知原因,無法實現這個愚蠢的事情。如何將主窗體中的值返回到不同的窗體或類(C#)

我有一個int count在主要的形式,我想返回到另一個類或窗體。

namespace my_speller 
{ 
    public partial class login : Form 
    { 
     public login() 
     { 
     InitializeComponent(); 
     } 

     int count; 
     private void btnlogin_MouseUp(object sender, MouseEventArgs e) 
     { 
      dbaccess obj = new dbaccess(); 

      for (int i = 0; i < 10; i++) 
      { 
        if (txtusername.Text == obj.Usersusername()[i]) 
        { 
         count = i; 
         break; 
        } 
      } 
     } 

     public int namecount() 
     { 
     return count; 
     } 

    } 
} 

dbaccess是另一個類,我可以成功地調用在類中定義的函數(Usersusername)我login形式。一切工作正常。現在我想把int count從主表格返回到dbaccess類。所以我實現了一個公共函數namecount返回count。但count在其他班級中始終爲零。在主窗體中,我正確地獲得了count的值(即i)。但是,當我從dbaccess類這種方式叫什麼獲取返回:

 login obj = new login(); 
     // do stuff 

或另一種形式在同一個程序,就像這樣:

namespace my_speller 
{ 
    public partial class student : Form 
    { 
     public student() 
     { 
     InitializeComponent(); 
     } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     login obj = new login(); 
     MessageBox.Show(obj.namecount().ToString()); 
    } 

這裏的消息框應顯示count這是一些數字,但是顯示的是零。可能是什麼原因?

當我試圖從主窗體返回一個字符串時,會發生同樣的事情。它總是空其他類:(

在此先感謝

編輯:你能不能給的代碼片段本身我不能知道的技術術語,你可以用它來幫助我

+1

雖然這不是問題的一部分,但我會建議大寫類名,因爲它會增加不必要的混淆 - 它們看起來像變量名或函數。 – 2011-03-22 13:48:55

+0

^謝謝。我會在將來處理它 – nawfal 2011-03-22 13:57:05

回答

2

此代碼將創建一個新的登錄表單實例。每個實例都有自己的實例變量數量。

login obj = new login(); 
MessageBox.Show(obj.namecount().ToString()); 

的整數的默認值是0,所以每次創建窗體的新實例時,它將具有0在計數變量的值。如果你想讓表單的所有實例具有相同的count值,你應該使靜態計數。

private static int count; 

當變量是靜態的時候,只有一個計數實例被登錄表單的所有實例共享。

var form1 = new login(); 
// mouse up event fires on form1, value of count is set to 3 (for example) 
var form2 = new login(); 
form2.namecount(); // returns 3 

取決於你想要做什麼,還有其他模式,如使用事件,或調解,可以幫助傳遞組件之間的消息。通過這種方式,當某種形式的事情發生時,其他形式可以對變化做出反應,而不需要引用甚至不需要知道應用程序中的其他形式。

+0

什麼是var? – nawfal 2011-03-22 13:33:04

+0

謝謝,這工作。其他答案也應該正常工作。但這是爲我做的。再次感謝。 – nawfal 2011-03-22 13:43:21

+0

@nawfal'var'關鍵字位於c#3和4中。當您使用它時,編譯器通過查看賦值運算符右側的操作(=)來計算出類型。在這種情況下,新的login()將返回登錄類的一個實例,所以編譯器知道form1是類型登錄的。這是一種較短的寫作方式'login form1 = new login();'。 – NerdFury 2011-03-22 13:44:17

4
private void button3_Click(object sender, EventArgs e) 
{ 
    login obj = new login(); 
    MessageBox.Show(obj.namecount().ToString()); 
} 

每次button3_Click被調用時,一個新的登錄對象被實例化 換句話說,OBJ不是主窗體的參考;它是到相同的類型的主要形式的另一對象的引用

每當有一個登錄對象實例化,計數默認爲零。

+0

好的,那麼如何創建一個對主表單的引用呢? – nawfal 2011-03-22 13:22:33

+0

無法用空氣創建對現有對象的引用。我假設你的主窗體創建了一個學生對象的實例。如果是這樣,那麼你的主表單也需要將自己的引用傳遞給學生對象。 – mbeckish 2011-03-22 13:25:22

+0

因此,您的學生對象將需要提供接受「登錄」類型對象的公共屬性或方法。這是您的主表單將用於傳遞參考的內容。 – mbeckish 2011-03-22 13:26:56

0

你在哪裏顯示錶格?你正在做的是代碼是簡單地創建一個登錄窗體的新實例,並閱讀nameCount值,它仍然在其初始化值:0.

我認爲你應該使用ShowDialog並返回結果在一個DialogResult。如果沒問題,那就讀取計數值。

相關問題