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

C# 将方法返回的值设置为公共字符串,c#,winforms,string,public,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 v

我试图在表单之间传递一个值——在本例中,是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中调用它,对吗

在表格2中,我只有以下内容:

    private void button1_Click(object sender, EventArgs e)
    {
        //Take selected case information
        fmHome fmhome = new fmHome();
        textBox1.Text = fmhome.GetCaseID();
    }
我知道跨表单通信是有效的:如果我用一个普通的旧字符串替换GetCaseID(),它将按预期在Form2中显示

这是否也与必须将案件公开有关


谢谢。

按钮中单击
,您正在创建
fmHome
类的新实例。这是一个与创建它的
fmHome
实例不同的实例,因此它在
dgCases
中没有选定的行。在此实例上调用
GetCaseID()
,将不会返回您期望的结果

您的
按钮1\u单击
处理程序需要有一种方法来调用打开它的表单上的
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();
}
因此,在
按钮1u单击
处理程序中,您可以访问该实例,而不是创建一个新实例:

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

希望这有帮助

您可以在button1\u Click中创建一个新的fmHome实例,这样它就不包含原始的datagrid

您可以将datagrid实例作为参数传递给Form2构造函数


注意:混合视图和数据的方式将导致无法维护的代码,这不是一个好的做法。。。但我假设您正在处理遗留代码?

在您这样做时创建一个新实例不会得到任何有意义的价值


相反,请确保
Form2
可以获得对原始
fmHome
实例的引用。最常见的模式是添加类型为
fmHome
的(private)
Form2
成员变量,并将其设置为
Form2
构造函数的一部分,要求创建者将其传入(在您的情况下,在
btnevluserselect\u Click
。然后您可以在
表单2中使用该成员。按钮1\u Click()
方法,而不是创建新的(不可见的)空表单。

您还可以执行以下操作:

//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;
    }
}

您还可以创建一个类,该类保存应用程序所需的所有信息,然后在需要的地方填充,并在另一个表单上从中获取数据,而不必连接这两个表单。但我不知道这是否是最佳解决方案。

好的,它使用普通字符串。如果您使用上面的代码,会出现什么问题ppens?我只是在教自己如何编程,现在犯了所有典型的初学者错误。你介意详细解释一下混合视图和数据的含义吗?将视图与模型分离-如果你使用WPF,请查看MVVM模式;如果你使用ASP.NET,请查看MVC模式。只需谷歌,你会发现很多关于它的信息:)甜甜圈-你似乎总是第一个回答并给出非常清晰的解释。这非常有效-再次感谢所有的帮助@大卫:没问题,很高兴我能帮上忙。