我正在尝试使用属性将两个集合从一个表单转移到另一个表单。 但是由于某些原因,我无法在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属性。
我错过了什么?
答案 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();