【问题标题】:Passing List of objects to another form c#将对象列表传递给另一个表单c#
【发布时间】:2020-03-13 15:16:55
【问题描述】:

我有 Form1,我想在其中使用我在 Form2 中创建的对象列表 listaPacienti,但它不起作用。 Pacient 是用于生成对象的类。

这是 Form1 的开始:

 public partial class Form1 : Form
    {

        Form2 formPacienti = new Form2();
        List<Pacient> listaPacienti = new List<Pacient>();

        public Form1()
        {
            InitializeComponent();

        }

这里是 Form2 的开头,我创建了列表 listaPacienti 我想传递给 Form1:

public partial class Form2 : Form
    {

        List<Pacient>listaPacienti=new List<Pacient>();
        Pacient p1 = new Pacient(0, "Pacient1", 0, 200);
        Pacient p2 = new Pacient(1, "Pacienct2", 0, 100);

        Form1 formMedici = new Form1(listaPacienti);

        public Form2()
        {
            InitializeComponent();
            listaPacienti.Add(p1);
            listaPacienti.Add(p2);
        }

出了什么问题,因为我之前在这里搜索过,建议这样做,如果我写错了我不知道是什么,因为在 Form2 中,来自下一行的参数“listaPacienti”

Form1 formMedici = new Form1(listaPacienti);

向我显示此消息:“字段初始值设定项无法引用非静态字段、方法或属性“Form2.listaPacienti”。

谢谢

【问题讨论】:

  • 您需要使用正确的访问修饰符。 This answer 列出默认值。他们都不是public。此外,Form1 没有定义接受 List 作为参数的构造函数,因此即使您可以访问 listaPacienti,这仍然是不正确的。

标签: c# winforms


【解决方案1】:

实际上这里有几处错误。错误本身告诉您在初始化 类成员时不能使用 类成员。您正在尝试使用listaPacienti 来初始化formMedici。但是您可以在构造函数中对其进行初始化。像这样的:

List<Pacient> listaPacienti = new List<Pacient>();
Pacient p1 = new Pacient(0, "Pacient1", 0, 200);
Pacient p2 = new Pacient(1, "Pacienct2", 0, 100);

Form1 formMedici;

public Form2()
{
    InitializeComponent();
    listaPacienti.Add(p1);
    listaPacienti.Add(p2);
    formMedici = new Form1(listaPacienti);
}

然而,您的Form1 构造函数也需要接受该参数。所以你要么需要修改现有的Form1 构造函数,要么添加一个新的:

public Form1(List<Pacient> listaPacienti)
{
    InitializeComponent();
    // do something with listaPacienti?
}

但是,您甚至不知道为什么要这样做。您在Form1 中创建Form2 的实例:

Form2 formPacienti = new Form2();

然后你在Form2中创建一个Form1的实例:

Form1 formMedici = new Form1(listaPacienti);

这是一个等待发生的无限递归。您真的希望Form2 创建Form1 实例吗?还是您想使用Form1现有 实例?如果是后者,则从Form2 中完全删除对Form1 的引用。

有多种方法可以实现您尝试做的总体目标,而哪一种是理想的不仅取决于此处介绍的方法。但鉴于现有信息,最简单的方法可能是让listaPacienti 可以从Form2 外部访问:

public List<Pacient> ListaPacienti { get; set; }
Pacient p1 = new Pacient(0, "Pacient1", 0, 200);
Pacient p2 = new Pacient(1, "Pacienct2", 0, 100);

public Form2()
{
    InitializeComponent();
    ListaPacienti = new List<Pacient>()
    ListaPacienti.Add(p1);
    ListaPacienti.Add(p2);
}

既然listaPacienti 是一个公共属性,任何引用Form2 实例的代码都可以访问该属性:

Form2 formPacienti = new Form2();
// Do other things with formPacienti?
// Either way, here you can access formPacienti.ListaPacienti

【讨论】:

    【解决方案2】:

    您需要再添加一个构造函数来形成这样的构造函数。

    public Form1(List<Pacient> list)
        {
            this.listaPacienti=list;
            InitializeComponent();
    
        }
    

    之后,您可以随心所欲地使用此代码。

    Form1 formMedici = new Form1(listaPacienti);
    

    【讨论】:

      【解决方案3】:

      Form1listaPacienti 的实例化移动到构造函数中。这个现有的答案很好地描述了您收到此错误的原因 - A field initializer cannot reference the nonstatic field, method, or property

      public partial class Form2 : Form
          {
      
              List<Pacient>listaPacienti;
              Pacient p1 = new Pacient(0, "Pacient1", 0, 200);
              Pacient p2 = new Pacient(1, "Pacienct2", 0, 100);
      
              Form1 formMedici;
      
              public Form2()
              {
                  listaPacienti=new List<Pacient>();
                  formMedici = new Form1(listaPacienti);
      
                  InitializeComponent();
                  listaPacienti.Add(p1);
                  listaPacienti.Add(p2);
              }
      }
      

      【讨论】:

        【解决方案4】:

        您可以执行以下操作

        发件人表单:

        private void btnIniciar_Click(object sender, EventArgs e)
            {
                this.Hide();
                Main newMain = new Main(this.lsProcesos);
                newMain.ShowDialog();
                this.Show();
        
            }
        

        接收方表格:

        public partial class Main : Form
        {
            List<Proceso> lsProcesos;
            public Main(object sender)
            {
                InitializeComponent();
                lsProcesos = (List<Proceso>)sender;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-15
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多