将方法的返回值设置为公共字符串

时间:2010-12-16 12:25:55

标签: c# winforms string public

我正在尝试在表单之间传递值 - 在本例中,是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声明为公共?

感谢。

4 个答案:

答案 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;
    }
}

你还可以做一个类,它包含你的应用程序所需的所有信息,然后在需要的地方填写它,并在另一个表单上从中获取数据,而不必连接它们。但我不知道这是否是最佳解决方案。