【问题标题】:C# - Pass data between two forms (Windows Forms Application)C# - 在两个窗体之间传递数据(Windows 窗体应用程序)
【发布时间】:2023-03-25 10:45:01
【问题描述】:

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

我的逻辑:

  • 在 Form2 上从用户那里获取信息并传递给其他类
  • 在 Form1 上从其他类获取信息并添加到 ListView

问题:

  • 对象种类ListViewItem返回null

Form2:从Form中获取信息

    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 的新手。

【问题讨论】:

    标签: c# winforms listview


    【解决方案1】:

    您在非 Form 类中有一个 ListViewItem(Windows 窗体项),这不是要走的路,您应该有 List 项。 您还想仅在主窗体中创建 EmployeeDAO 对象,并通过后者的构造函数与注册窗体共享它。另一种方法是使用单例模式。

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

    希望对你有帮助!!

    【讨论】:

    • 我有一个问题,为什么注册需要EmployeeDAO 对象作为参数?我无法以Main 的形式访问foreach 上的Items?它还没有工作
    • 因为每次创建新实例时,EmployeeDAO 都会设置一个新的员工列表。因此,不要在每次将创建的第一个 EmployeeDAO 传递给其他类并重用现有的带有数据的 Employee 列表的地方创建一个新的 EmployeeDAO 和一个空的 Employee 列表。在 EmployeeDAO 类中,将 public 放在声明 List 项之前。在深入研究代码之前,您确实应该了解更多。如果对我的回答有帮助,请将其标记为正确答案。
    【解决方案2】:

    通过表单传递数据的主要思想是使您将使用的控件修饰符公开,以便您可以在其他表单中使用它,然后您可以 制作第二种形式和代码的对象,但无论如何请查看这些链接,我希望它会对您有所帮助

    复制how to pass listview row data into another existing form
    Accessing listview items from another form
    c# Add listView items from another form

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多