在c#的两种不同形式中使用数组

本文关键字:数组 两种 | 更新日期: 2023-09-27 18:09:27

我有一个问题,数组是由类;实际上我可以从一个类中创建一个数组,在第一种形式中,我将数据设置在一个数组中,但是当我切换到第二种形式并从我的类中创建一个对象时,我发现我的数组是空的,所以我不能使用我输入到我的数组中的信息开关。

public partial class Form1 : Form
{
    string _name;
    string _department;
    int _id;
    int _count;
    int counter = 0;
    Mediator m = new Mediator();
    Employee ee = new Employee();
    public Form1()
    {
        InitializeComponent();
    }
    private void Add_to_Array_Click(object sender, EventArgs e)
    {
        _name = txtName.Text;
        _department = txtDepartment.Text;
        _id = int.Parse(txtID.Text);
        _count = counter;
        m.Set_Value(_name, _department, _id,_count);
        counter++;
        Exchange();
        //-----------------------------------
        txtDepartment.Text = "";
        txtID.Text = "";
        txtName.Text = "";
    }
    private void Search_Click(object sender, EventArgs e)
    {
        listBox1.Items.Add(m.array[0].E_Name);
        listBox1.Items.Add(m.array[0].E_Department);
        listBox1.Items.Add(m.array[0].E_ID.ToString());
        //---------------------------------------------------
        listBox1.Items.Add(m.array[1].E_Name);
        listBox1.Items.Add(m.array[1].E_Department);
        listBox1.Items.Add(m.array[1].E_ID.ToString());
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show();          
    }

public partial class Form2 : Form
{
   Mediator M;
    public Form2()
    {
        InitializeComponent();
    }
    private void Show2_Click(object sender, EventArgs e)
    {
        listBox1.Items.Add(M.array[0].E_Name);
        listBox1.Items.Add(M.array[0].E_Department);
        listBox1.Items.Add(M.array[0].E_ID.ToString());
        //---------------------------------------------------
        listBox1.Items.Add(M.array[1].E_Name);
        listBox1.Items.Add(M.array[1].E_Department);
        listBox1.Items.Add(M.array[1].E_ID.ToString());            
    }

class Employee
{
    string Name;
    string Department;
    int ID;
    //**************************
    public string E_Name
    {
        get { return Name; }
        set { Name = value; }
    }
    public string E_Department
    {
        get { return Department; }
        set { Department = value; }
    }
    public int E_ID
    {
        get { return ID; }
        set { ID = value; }
    }
}

class Mediator
{
   public Employee[] array = new Employee[5];
   public void Set_Value(string name,string department,int id,int count)
   {
       array[count] = new Employee();
       array[count].E_Name = name;
       array[count].E_Department = department;
       array[count].E_ID = id;
   }
}

在c#的两种不同形式中使用数组

我强烈建议您不要将Mediator m设置为静态。我的意思是,这是一个技巧,你不会想要养成在任何地方有效地创建全局变量的习惯,它会在你的职业生涯中回来咬你。

更好的解决方案是只传递Form2需要处理的数据。我猜Form2只需要显示雇员列表,所以你应该在Form2中创建一个属性,如下所示:

public Employee[] Employees {get; set;}

[如果您需要的不仅仅是员工列表,那么您应该为调解员提供一个属性- public Mediator Mediator {get;设置;}]

在显示第二个表单之前,您需要将这些数据发送到第二个表单:

Form2 f2 = new Form2();
f2.Employees = m.array;
f2.Show();

由于数据是通过引用发送的,所以在form2中所做的任何更改都会反映在form1中存储的对象中。


另一个选择是使用MVC模式构建程序。这有点高级,但这是一个很好的模式,可以让你的winForms应用保持整洁。如果你正在构建一个向导风格的应用程序,那么我强烈建议你使用这种方法。


顺便说一句,您还可以通过使用列表而不是数组来存储员工数据来清理代码—这也将使代码更适合将来更多的员工。您还可以使用c#的自动属性来减少需要编写的代码量。所以你的代码可以像这样:

public partial class Form1 : Form
{ 
    private Mediator _mediator = new Mediator(); 
    public Form1()
    {
        InitializeComponent();
    }
    private void Add_to_Array_Click(object sender, EventArgs e)
    {
        var newEmployee = new Employee
        {
            Name = txtName.Text,
            Department = txtDepartment.Text,
            ID = int.Parse(txtID.Text)
        };
        _mediator.Employees.Add(newEmployee);
        Exchange();
        //-----------------------------------
        txtDepartment.Text = "";
        txtID.Text = "";
        txtName.Text = "";
    }
    private void Search_Click(object sender, EventArgs e)
    {
        foreach (var employee in _mediator.Employees)
        {
            listBox1.Items.Add(employee.Name);
            listBox1.Items.Add(employee.Department);
            listBox1.Items.Add(employee.ID.ToString());
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Employees = _mediator.Employees;
        f2.Show();
    }
}

public partial class Form2 : Form
{
    public List<Employee> Employees { get; set; }
    public Form2()
    {
        InitializeComponent();
    }
    private void Show2_Click(object sender, EventArgs e)
    {
        foreach (var employee in Employees)
        {
            listBox1.Items.Add(employee.Name);
            listBox1.Items.Add(employee.Department);
            listBox1.Items.Add(employee.ID.ToString());
        } 
    }
}
class Employee
{
    public string Name { get; set; }
    public string Department { get; set; }
    public int ID { get; set; } 
}
class Mediator
{
    public List<Employee> Employees { get; private set; }
    public Mediator()
    {
        Employees = new List<Employee>();
    }
}   

您需要Form2中的Form1实例来使用您创建的数组。

你有两个选择;首先,您可以将Form1的实例存储在一个公共类中,以便您可以从Form2访问它。

第二个选项;您需要将Form1的引用传递给Form2实例

一个快速解决问题的方法是在数组定义中添加static关键字。这将使其无状态,因此不会在每次访问它时创建一个新的(数组的实例)。你还应该考虑把这个数组放在某种静态类中,它将负责处理这种全局变量。
至于你的编辑,你至少有两种选择:第一种是在static中制作Mediator类和array;或者在第二种形式中创建一个属性,如public string [] SomeArray {get; set;},并在声明... = new Form2();之后和调用.Open()之前将数组传递给它