2010-12-16 76 views
4

我試圖傳遞窗體之間的值 - 在這種情況下,在DataGridView中突出顯示的單元格的結果。設置方法的返回值爲公共字符串

在我的主要形式,我得到使用公共字符串方法的價值:

public string GetCaseID() 
    { 
     int i; 
     i = dgCases.SelectedCells[0].RowIndex; 
     string caseid = dgCases.Rows[i].Cells[1].Value.ToString(); 
     string version = dgCases.Rows[i].Cells[2].Value.ToString(); 
     return version + "_c" + caseid; 
    } 

    //Form2 is launched 
    private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
    { 
     Form2 form2= new Form2(); 
     form2.ShowDialog(); 
    } 

由於GetCaseID()被聲明爲公用字符串,我應該能夠從我的窗體2調用它,對嗎?

在窗體2,我只有這個:

private void button1_Click(object sender, EventArgs e) 
    { 
     //Take selected case information 
     fmHome fmhome = new fmHome(); 
     textBox1.Text = fmhome.GetCaseID(); 
    } 

我知道跨形式的通信方式:如果我有一個普通的老字符串替換GetCaseID(),它顯示爲預計在窗體2。

難道這與將dgCases聲明爲公共一樣嗎?

謝謝。

+0

好吧,它使用正常的字符串。如果你使用上面的代碼,會發生什麼? – TToni 2010-12-16 12:29:58

回答

4

button1_Click中,您正在創建fmHome類的新實例。這是一個不同的實例,它創建它的fmHome實例,所以它沒有在dgCases中的選定行。在這個實例上調用GetCaseID()不會返回你所期望的。

您的button1_Click處理程序需要在打開它的窗體上調用GetCaseID()。一個非常基本的方法是添加上Form2這樣的特性:

public fmHome fmHomeParent { get; set; } 

然後,當你打開你的Form2情況下,這樣做:在你button1_Click處理

private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
{ 
    Form2 form2= new Form2(); 
    form2.fmHomeParent = this; 
    form2.ShowDialog(); 
} 

所以,你可以訪問該實例,而不是創建一個新的:

private void button1_Click(object sender, EventArgs e) 
{ 
    //Take selected case information 
    textBox1.Text = fmHomeParent.GetCaseID(); 
} 

希望這有助於!

+0

甜甜圈 - 你似乎總是第一個回答,並提供非常清晰的解釋。這工作完美 - 再次感謝所有的幫助! – 2010-12-16 12:40:43

+0

@David M沒問題,很高興我能幫上忙。 – Donut 2010-12-16 12:47:21

1

您在button1_Click中創建了fmHome的新實例,因此它不包含原始數據網格。

您可以將datagrid的實例作爲參數傳遞給Form2構造函數。

注意:混合視圖和數據的方式會導致不可維護的代碼,這不是一個好習慣......但我認爲您正在處理遺留代碼?

+0

只是教自己如何編程和目前正在犯的所有典型的初學者錯誤。您是否介意通過混合視圖和數據來進一步闡述您的意思? – 2010-12-16 12:39:51

+0

將視圖與模型分離 - 如果您使用的是WPF,請查看MVVM模式;或者如果您使用的是ASP.NET,請查找MVC模式。只是谷歌,你會發現很多關於它的信息:) – 2010-12-16 12:43:57

0

正在創建一個新實例不會得到任何有意義的值。

相反,請確保Form2可以獲得對原始fmHome實例的引用。最常見的模式是添加一個(私有的)類型爲fmHome的成員變量,並將其設置爲Form2構造函數的一部分,要求創建者將其傳入(在您的情況下,在btnEvLvlUserSelect_Click中)。然後,您可以使用成員在您的Form2.button1_Click()方法中,而不是創建新的(不可見的)空表單。

0

什麼,你也可以做的是以下幾點:

//Form2 is launched 
private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
{ 
    Form2 form2= new Form2(this.GetCaseID()); 
    form2.ShowDialog(); 
} 

然後在窗體2:

public partial class PlayerInfo : Form 
{ 
    string caseID; 
    public Form2(string fmHomeCaseID) 
    { 
     caseID = fmHOmeCaseID; 
    } 


    // Button Click in your second form 
    private void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = caseID; 
    } 
} 

什麼,你也可以做的就是讓持有所有需要的信息類的應用程序,然後在需要時填充它,並從另一個表單上獲取數據,而無需連接它們。但我不知道這是否是最好的解決方案。

相關問題