2010-12-16 75 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; 
    } 
} 

什么,你也可以做的就是让持有所有需要的信息类的应用程序,然后在需要时填充它,并从另一个表单上获取数据,而无需连接它们。但我不知道这是否是最好的解决方案。