使用属性在表单之间传输数据

时间:2015-04-06 10:54:55

标签: c# winforms forms

我正在尝试使用属性将两个集合从一个表单转移到另一个表单。 但是由于某些原因,我无法在form1中看到form2的属性。我得到的错误信息是

  

System.Windows.Forms.Form不包含_col1和。的定义   没有扩展方法_col1接受类型的第一个参数   System.Windows.Forms.Form中....

以下是Form1的代码

 public partial class Form1 : Form
 {

    private Collection<string> col1;
    private Collection<string> col2;

    private void btn1_Click(object sender, EventArgs e)
    {
        Form frm1 = new Form2();

        //fill collections with some kind of data

        frm1._col1 = _col1;
        frm1._col2 = _col2;

        frm1.Show();
    }
    public Collection<string> _col2
    {
        get { return col2; }
    }

    public Collection<string> _col1
    {
        get { return col1; }
    }
 }

以下是Form2的代码

public partial class Form2 : Form
{
    private Collection<string> col1;
    private Collection<string> col2;        

    public Form2()
    {
        InitializeComponent();
    }

    public Collection<string> _col1
    {
        get { return col1; }

        set { col1 = value; }
    }

    public Collection<string> _col2
    {
        get { return col2; }

        set { col2 = value; }
    }
}

根据我读过的文章,一切都应该有效 - 但是我无法从Form1访问Form2属性。

我错过了什么?

2 个答案:

答案 0 :(得分:4)

您已声明frm1变量,如下所示:

Form frm1 = new Form2();

因此,编译器将假定它是Form类型。正如错误消息正确解释的那样,Form没有任何名为_col1的属性或方法。

如果您将变量声明为属于类型Form2,则编译器将找到您的属性:

Form2 frm1 = new Form2();

CoderDennis所述,您也可以使用var keyword而不是明确声明变量的类型:

var frm1 = new Form2();

请注意,C# programming guide提醒:

  

但是,使用var确实至少有可能使您的代码对其他开发人员更难理解。因此,C#文档通常仅在需要时才使用var。

对于一般的代码来说,这不是一个不明智的想法,只要var不能替换写入非常麻烦的东西(例如泛型类型)。


关于编码风格的评论:惯例是,属性以大写字母开头,因此您可能希望将属性从_col1_col2重命名为Col1和{分别为{1}}。

如果您希望在视觉上清楚地区分属性和私有支持字段,请将下划线放在私有字段的名称中,正如CoderDennis在其评论中正确指出的那样。

答案 1 :(得分:1)

更新参考文件如下:

Form2 frm1 = new Form2();

col1在Form2类中被解析。 由于Form1和Form2类具有相同的属性,因此可以考虑创建

interface IFormWithCollection
{
Collection<string> _col1
    {
        get;
        set;
    }

    Collection<string> _col2
    {
        get;  set;
    }
}

然后实现Fom1和Form2定义:Form1 : Form, IFormWithCollection

Form2 : Form, IFormWithCollection

然后:

IFormWithCollection frm1 = new Form2();