1

我已经设置了一个包含名称/数字/等的类,并创建了一个对象列表来保存它们。我想在 ListView 的第二个表单上显示它们。现在我正在使用像...

public List<Employee> GetEmpList(){
    return EmployeeList;
}

然后在第二个表单的构造函数中,我使用了 Form1.GetEmpList() 之类的......

DisplayForm{
InitializeComponent();
LoadEmployees(EmployeeAddition.GetList()); 
}

我收到错误消息说“非静态字段需要对象引用”。我调用的方法是非静态的,它返回对 Form1 类中的 List 的引用。我什至尝试将 List 公开并使用 Form1.List 进行调用,但它仍然给我同样的错误。

有没有办法在 Form 类之间传递 List 还是不可能?

编辑:Poeple 说需要更多信息。我不想在这里复制粘贴所有代码,但我会放一大块,因为我是新手,不太确定什么是相关的,什么不是。(我正在上课,但远程,我的老师是……远程老师,没用。她居然让我在这里问)

我想我错过了如何使方法实例化,我认为当从类创建对象时,方法成为对象的一部分。该方法是 Form1(重命名但就是这样)类/对象的一部分。我将在这里设置代码,我不知道这是否令人不悦;如果是这样,我很抱歉。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EmplyeeList
{
    public partial class EmployeeDisplay : Form
    {
        public EmployeeDisplay()
        {
            InitializeComponent();
            LoadEmployees(EmployeeAddition.GetList());

        }

        private void LoadEmployees(IList<CorpEmployee> emp)
        {
            foreach (CorpEmployee ce in emp)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.SubItems.Add(ce.Name);
                lvi.SubItems.Add(ce.Address);
                lvi.SubItems.Add(ce.PhoneNumber);
                lvi.SubItems.Add(ce.ServiceArea);
                lvi.SubItems.Add(ce.EmplNumber.ToString());
                lvi.SubItems.Add(ce.RoomNumber.ToString());
                lvi.SubItems.Add(ce.PhoneExt.ToString());
                lvi.SubItems.Add(ce.email);
                displayListView.Items.Add(lvi);
            }
        }

        private void closeButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }    
}

这是第一个要加载的 Form 类...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EmplyeeList
{
    public class EmployeeAddition : Form
    {
        //Create a list to hold CorpEmployee objects.
        private List<CorpEmployee> CorpEmplList = new List<CorpEmployee>();
        public EmployeeAddition()
        {
            InitializeComponent();
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            int testingNum;     //Used for output in parsing numbers

            //If statments are used to make sure ints are ints, and nothing is blank.
            if (Int32.TryParse(employeeNumTextBox.Text, out testingNum) || !    (employeeNumTextBox.Text == ""))
            {
                if (Int32.TryParse(roomNumTextBox.Text, out testingNum) || !(roomNumTextBox.Text == ""))
                {
                    if (Int32.TryParse(phoneExtTextBox.Text, out testingNum) || !(phoneExtTextBox.Text == ""))
                    {
                        if (!(nameTextBox.Text == "") || !(addressTextBox.Text == "") || !(titleTextBox.Text == "") || !(phoneNumberTextBox.Text == "") ||
                            !(serviceAreaTextBox.Text == "") || !(emailTextBox.Text == ""))
                        {
                            //If all fields are filled in right then we add the object to the List
                            CorpEmplList.Add(CreateCorpEmployee(nameTextBox.Text, addressTextBox.Text, titleTextBox.Text,
                            phoneNumberTextBox.Text, serviceAreaTextBox.Text,
                            Convert.ToInt32(employeeNumTextBox.Text), Convert.ToInt32(roomNumTextBox.Text),
                            Convert.ToInt32(phoneExtTextBox.Text), emailTextBox.Text));
                            //Let the user know it was added
                            MessageBox.Show("Employee was added!");
                            //Clear fields
                            ClearAllFields();
                        }
                        else
                        {
                            MessageBox.Show("All fields must be filled in.");
                        }

                    }
                    else
                    {
                        MessageBox.Show("Phone Ext.# should be a number");
                    }

                }
                else
                {
                    MessageBox.Show("Check your Room# and try again.");
                }
            }
            else
            {
                MessageBox.Show("Employee Number Should be a number.");
            }

        }

        //This takes in all the employee fields and returns a contructed object
        private CorpEmployee CreateCorpEmployee(String name, String address, String title, String phoneNumber, 
            String serviceArea, int emplNumber, int roomNumber, int phoneExt, String email)
        {
            CorpEmployee corpEmpObject = new CorpEmployee(name, address, title, phoneNumber, serviceArea, emplNumber, roomNumber, phoneExt, email);

            return corpEmpObject;
        }

        //This just clears all the fiels
        private void ClearAllFields()
        {
            nameTextBox.Text = "";
            addressTextBox.Text = "";
            titleTextBox.Text = "";
            phoneNumberTextBox.Text = "";
            serviceAreaTextBox.Text = "";
            employeeNumTextBox.Text = "";
            roomNumTextBox.Text = "";
            phoneExtTextBox.Text = "";
            emailTextBox.Text = "";

        }

        //This returns the List of CorpEmployees
        public List<CorpEmployee> GetList()
        {
            return CorpEmplList;
        }
        private void exitButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void clearButton_Click(object sender, EventArgs e)
        {
            ClearAllFields();
        }

        private void showButton_Click(object sender, EventArgs e)
        {
            EmployeeDisplay ed = new EmployeeDisplay();

            ed.Show();
        }
    }
}

重新查看代码后,我想我可能会看到您所说的从静态类而不是对象调用它的内容。有没有办法找到编译器从第一个表单创建的对象的名称?

4

2 回答 2

2

您遇到的第一个问题是将GetEmpList()函数视为静态方法。它不是静态的,可能不应该是静态的。这就是为什么人们说你需要创建它的一个实例。但是,查看您要询问的内容可能存在更基本的缺陷,只需创建一个新版本的表单即可解决。问题是您想在表单之间传递模型数据。如果没有更多信息,真的很难说出您希望这一切如何结合在一起。但是,您可能已经有一个EmployeeAddition表单实例,并且不需要在DisplayForm. 相反,您应该做的是LoadEmployees公开该方法并将结果传递给 该方法GetEmpList()

所以你的结构会更像

public class EmployeeAddition : Form {

...

public List<Employee> GetEmpList(){
    return EmployeeList;
}

...

public void ShowDisplayForm(){
    var displayForm = new DisplayForm();
    displayForm.LoadEmployees(GetEmpList());
    displayForm.Show();
}

...

}

当然,这种结构可能会稍有偏差,因为我猜测哪种形式将拥有哪种形式,但这更接近您想要的。

于 2013-07-10T02:21:24.370 回答
1

尝试使用“新”

DisplayForm{
InitializeComponent();

EmployeeAddition = new EmployeeAdditionClass();

LoadEmployees(EmployeeAddition.GetList()); 
}
于 2013-07-10T01:58:47.207 回答