【问题标题】:Using properties to transfer data between forms使用属性在表单之间传输数据
【发布时间】:2015-04-06 10:54:54
【问题描述】:

我正在尝试使用属性将两个集合从一个表单传输到另一个表单。 但是由于某种原因,我在 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 属性。

我错过了什么??

【问题讨论】:

  • 虽然您正在实例化 Form2,但您的本地引用是基址 Form。将btn1_Click 中的行更改为Form2 frm1 = new Form2();(并考虑为您的类和局部变量赋予更有意义的名称)
  • 并不是说它会有所作为,但通常私有成员是以下划线开头的成员
  • 感谢 StuartLC - 这就是解决方案。
  • 感谢 CoderDennis 的建议 - 我将更改名称以符合通用标准。我对编程很陌生,还有很多东西要学……
  • @Stefan:如果您的问题得到解决,请将解释如何解决问题的答案之一标记为已接受。这将向未来的访问者发出问题已得到解答的信号,以及在哪个答案中找到可行的解决方案。

标签: c# winforms forms


【解决方案1】:

您已经像这样声明了您的 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 分别重命名为 Col1Col2

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

【讨论】:

  • 或者使用var frm1,它会和Form2 frm1做同样的事情而无需考虑。
【解决方案2】:

更新参考如下:

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();

【讨论】:

  • 只有在两个类的实例在任何情况下都可以互换时才建议使用该接口。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 2019-04-25
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-12-10
相关资源
最近更新 更多