在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;
}
}
我强烈建议您不要将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()
之前将数组传递给它