Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-在两个窗体之间传递数据(Windows窗体应用程序)_C#_Winforms_Listview - Fatal编程技术网

C# C-在两个窗体之间传递数据(Windows窗体应用程序)

C# C-在两个窗体之间传递数据(Windows窗体应用程序),c#,winforms,listview,C#,Winforms,Listview,我在C Windows窗体应用程序中有一个项目,在我的项目中有两个屏幕,1-ListView显示数据,2-Formulary获取信息并放在ListView上,主要问题是,将信息从Form2传递到Form1 我的逻辑是: 从Form2上的用户处获取信息并传递给其他类 在Form1上,从另一个类和加载项ListView获取信息 问题是: 对象种类ListViewItem返回null 表格2:从表格中获取信息 namespace Company { public partial cla

我在C Windows窗体应用程序中有一个项目,在我的项目中有两个屏幕,1-ListView显示数据,2-Formulary获取信息并放在ListView上,主要问题是,将信息从Form2传递到Form1

我的逻辑是:

从Form2上的用户处获取信息并传递给其他类 在Form1上,从另一个类和加载项ListView获取信息 问题是:

对象种类ListViewItem返回null 表格2:从表格中获取信息

    namespace Company
{
    public partial class Register : Form
    {
        EmployeeDAO employeeDAO = new EmployeeDAO();

        public Register()
        {
            InitializeComponent();
        }

        private void btnRegister_Click(object sender, EventArgs e)
        {
            Employee employee = new Employee();
            employee.idEmployee = Convert.ToInt16(this.txtId.Text);
            employee.nameEmployee = this.txtName.Text;
            employeeDAO.insert(employee);

        }

    }
}
我的类DAO从Form2获取信息并传递到Form1:我获取信息并放置ListViewItem并返回它

namespace Company
{
    class EmployeeDAO
    {
        ListViewItem item = new ListViewItem();

        public void insert(Employee employee)
        {
            string id;
            string name;
            id = Convert.ToString(employee.idEmployee);
            name = employee.nameEmployee;
            String[] row = { id, name };
            item = new ListViewItem(row);
        }

        public ListViewItem read()
        {
            //This item are returning null
            return item;
        }
    }
}
Form1在ListView上显示数据:我获取ListViewItem对象并添加到ListView

namespace Company
{
    public partial class Main : Form
    {

        public Main()
        {
            InitializeComponent();
            lstEmployee.View = View.Details;
            lstEmployee.FullRowSelect = true;
            lstEmployee.Columns.Add("ID", 150);
            lstEmployee.Columns.Add("Nome", 150);
            insert();
        }

        private void insert()
        {
            EmployeeDAO employeeDAO = new EmployeeDAO();
            ListViewItem item = employeeDAO.read();
            if (item == null)
            {
                //Always this block run
                MessageBox.Show("No Item");
                return;
            }
            else
            {
                MessageBox.Show("Item");
                lstEmployee.Items.Add(item);
            }            
        }

        private void btnRegister_Click(object sender, EventArgs e)
        {
            Register register = new Register();
            register.Show();
            this.Hide();
        }
    }
}
有人能解释一下怎么做,如果是正确的方法吗?
PS:我是C和OO的新手。

如果您在非表单类中有一个ListViewItem和一个Windows表单项,那么这不是解决方法,您应该使用列表项。 另外,您希望仅在主窗体中创建EmployeeDAO对象,并通过后者的构造函数与Register窗体共享它。实现这一点的另一种方法是使用Singleton模式

namespace Company
{
    public partial class Register : Form
    {
        EmployeeDAO employeeDAO;

        public Register(EmployeeDAO employeeDAO)
        {
            InitializeComponent();
            this.employeeDAO = employeeDAO;
        }

        private void btnRegister_Click(object sender, EventArgs e)
        {
            Employee employee = new Employee();
            employee.idEmployee = Convert.ToInt16(this.txtId.Text);
            employee.nameEmployee = this.txtName.Text;
            employeeDAO.insert(employee);

        }

    }
}

namespace Company
{
    class EmployeeDAO
    {
        List<Employee> Items {get; private set;}

        public EmployeeDAO()
        {
            Items = new List<Employee>();
        }

        public void insert(Employee employee)
        {
            Items.Add(employee);
        }
    }
}

namespace Company
{
    public partial class Main : Form
    {
        EmployeeDAO employeeDAO;
        public Main()
        {
            InitializeComponent();
            lstEmployee.View = View.Details;
            lstEmployee.FullRowSelect = true;
            lstEmployee.Columns.Add("ID", 150);
            lstEmployee.Columns.Add("Nome", 150);
            employeeDAO = new EmployeeDAO();

        }

        private void InsertEmployeesInListBox()
        {
            lstEmployee.Items.Clear();
            foreach (var item in employeeDAO.Items)
            {
                string[] row = { item.idEmployee.ToString(), item.nameEmployee };
                var listViewItem = new ListViewItem(row);
                lstEmployee.Items.Add(listViewItem);
            }

        }

        private void btnRegister_Click(object sender, EventArgs e)
        {
            Register register = new Register(employeeDAO);
            register.Show();
            this.Hide();
        }
    }
}

我希望这有帮助

通过表单传递数据的主要思想是将要使用的控件的修饰符设置为公共的,这样您就可以在另一个表单中使用它了 制作一个第二种形式和代码的对象,但无论如何,看到这些链接,我希望它能帮助你

消光

我有个问题,为什么Register需要EmployeeDAO对象作为参数?我无法在表单Main中访问foreach上的项目?因为每次创建新实例时,EmployeeDAO都会设置一个新的员工列表,所以它不起作用。因此,不要创建一个新的EmployeeDAO,其中每个类都有一个空的EmployeeDAO列表,将您创建的第一个EmployeeDAO传递给其他类,并使用已有的数据重用现有的EmployeeDAO列表。在EmployeeDAO类中,将公共项放在声明列表项之前。在深入研究代码之前,您确实应该了解更多。如果我的答案有帮助,请将其标记为正确答案。