我正在尝试在表单之间传递值 - 在本例中,是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()被声明为公共字符串,我应该可以从我的Form2中调用它,对吗?
在Form2中,我只有这个:
private void button1_Click(object sender, EventArgs e)
{
//Take selected case information
fmHome fmhome = new fmHome();
textBox1.Text = fmhome.GetCaseID();
}
我知道跨表单通信有效:如果我用一个普通的旧字符串替换GetCaseID(),它会在Form2中按预期显示。
是否必须将dgCases声明为公共?
感谢。
答案 0 :(得分:4)
在button1_Click
中,您正在创建fmHome
类的新实例。这是与创建它的fmHome
实例的不同实例,因此它在dgCases
中没有选定的行。在此实例上调用GetCaseID()
将不会返回您所期望的内容。
您的button1_Click
处理程序需要有一种方法可以在打开它的表单上调用GetCaseID()
。一种非常基本的方法是在Form2
上添加这样的属性:
public fmHome fmHomeParent { get; set; }
然后,当您打开Form2
的实例时,请执行以下操作:
private void btnEvLvlUserSelect_Click(object sender, EventArgs e)
{
Form2 form2= new Form2();
form2.fmHomeParent = this;
form2.ShowDialog();
}
因此,在button1_Click
处理程序中,您可以访问该实例而不是创建新实例:
private void button1_Click(object sender, EventArgs e)
{
//Take selected case information
textBox1.Text = fmHomeParent.GetCaseID();
}
希望这有帮助!
答案 1 :(得分:1)
您在button1_Click中创建fmHome的新实例,因此它不包含原始数据网格。
您可以将datagrid的实例作为参数传递给Form2构造函数。
注意:混合视图和数据的方式会导致无法维护的代码,这不是一个好习惯...但我假设您正在处理遗留代码?
答案 2 :(得分:0)
正在创建新实例将不会获得任何有意义的值。
相反,请确保Form2
可以获得对原始fmHome
实例的引用。最常见的模式是添加类型为Form2
的(私有)fmHome
成员变量,并将其设置为Form2
构造函数的一部分,要求创建者将其传递(在您的情况下,在btnEvLvlUserSelect_Click
中。然后您可以在Form2.button1_Click()
方法中使用该成员,而不是创建新的(不可见的)空表单。
答案 3 :(得分:0)
您还可以做以下事情:
//Form2 is launched
private void btnEvLvlUserSelect_Click(object sender, EventArgs e)
{
Form2 form2= new Form2(this.GetCaseID());
form2.ShowDialog();
}
然后在Form2中:
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;
}
}
你还可以做一个类,它包含你的应用程序所需的所有信息,然后在需要的地方填写它,并在另一个表单上从中获取数据,而不必连接它们。但我不知道这是否是最佳解决方案。