我是c#的初学者。我被困在这项任务上。我试图在类类型全局数组中存储值,但数组不保存此。我尝试了很多但失败了。
以下是代码:
public class GlobalVariable
{
public static Employeeclass[] staff = new Employeeclass[10];
public static int total=0;
}
public class Employeeclass
{
public int id;
public string name;
public double salary;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var myform = new Form2();
myform.Show();
}
private void button2_Click(object sender, EventArgs e)
{
var myForm = new Form3();
myForm.Show();
}
private void button3_Click(object sender, EventArgs e)
{
double totalsalary = 0;
for (int i = 0; i < GlobalVariable.total; i++)
{
totalsalary+=GlobalVariable.staff[i].salary;
}
string a = GlobalVariable.total.ToString();
string b = totalsalary.ToString();
MessageBox.Show("total employee = " + a +"\ntotal salary = " + b);
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Back);
}
public void button1_Click(object sender, EventArgs e)
{
if (textBox2 == null)
{
MessageBox.Show("please enter employee name");
}
else
{
GlobalVariable.staff[GlobalVariable.total].id = Convert.ToInt32(textBox1.Text);
GlobalVariable.staff[GlobalVariable.total].name = textBox2.Text;
GlobalVariable.staff[GlobalVariable.total].salary = 0.0;
GlobalVariable.total++;
}
this.Close();
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = (GlobalVariable.total + 1).ToString();
}
}
public partial class Form3 : Form
{
//string temp;
//double a;
public Form3()
{
InitializeComponent();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox1.Items.Clear();
for (int i = 0; i < GlobalVariable.total; i++)
{
comboBox1.Items.Insert(i,GlobalVariable.name[i]);
// comboBox1.Items.Add(GlobalVariable.name[i]);
}
if (comboBox1.SelectedItem != null)
{
textBox1.Enabled = true;
}
}
private void button2_Click(object sender, EventArgs e)
{
var myform = new Form2();
myform.Show();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem != null)
{
textBox1.Enabled = true;
}
}
}
答案 0 :(得分:2)
您的代码并未初始化员工。您必须首先创建一个新员工实例(与结构不同,默认情况下已经完全正常工作&#34;实例&#34;):
public void button1_Click(object sender, EventArgs e)
{
if (textBox2 == null)
{
MessageBox.Show("please enter employee name");
}
else
{
// Create a new instance in the array
GlobalVariable.staff[GlobalVariable.total] = new Employeeclass();
GlobalVariable.staff[GlobalVariable.total].id =
Convert.ToInt32(textBox1.Text);
GlobalVariable.staff[GlobalVariable.total].name = textBox2.Text;
GlobalVariable.staff[GlobalVariable.total].salary = 0.0;
GlobalVariable.total++;
}
this.Close();
}
但是,我必须指出这是一个非常不开心的设计。全局变量?可变长度数据的固定长度数组?不存在的封装?
例如,更好的方法可能是创建对话框,对话框:
private NewEmployeeForm()
{
InitializeComponent();
}
public static EmployeeClass ShowDialog()
{
var frm = new NewEmployeeForm();
while (frm.ShowDialog() == DialogResult.OK)
{
if (string.IsNullOrEmpty(frm.tbxName.Text))
{
MessageBox.Show("Please, enter the employee name.");
}
else
{
var emp = new EmployeeClass();
emp.Id = int.Parse(frm.tbxId.Text);
emp.Name = frm.tbxName.Text);
return emp;
}
}
return null;
}
忘记1980年代的编码。将代码分成或多或少孤立的部分真的很有必要。阅读一下面向对象编程,特别是封装。即使在您的学习项目中,也要为变量和控件使用有意义的名称!你真的需要这个习惯,这是不可妥协的。
此外,尝试寻找一种先解决问题的方法。例如,.NET中有一个List
类,它处理一个自扩展的数据列表。所以你可以使用这样的东西:
List<EmployeeClass> employees = new List<EmployeeClass>();
employees.Add(emp1);
employees.Add(emp2);
employees.Add(emp3);
MessageBox.Show("I've got " + employees.Count + " employees!");
不要忘记错误处理。我知道你只是在做一个学习项目,但同样,你想要正确的习惯。将字符串解析为整数?检查它实际上是否为整数。处理可能的异常。使用数据验证。如果我在textBox1中输入hi
,您的应用程序将崩溃或显示&#34; break / continue / abort&#34;对话。那不好。
答案 1 :(得分:1)
您需要初始化数组中的每个“EmployeeClass”对象。 默认情况下,创建数组时,它有10个插槽填充“null”
我建议添加一个静态构造函数:
public static class GlobalVariable
{
public static Employeeclass[] staff;
public static int total=0;
static GlobalVariable()
{
staff = new Employeeclass[10];
for (int i = 0; i < staff.Length; i++)
staff[i] = new EmployeeClass();
}
}
当您第一次引用GlobalVariable类中的任何内容时,将调用静态构造函数。此类也应声明为“静态”,因为它的所有成员都是静态的。编译器可以用这种方式生成更高效的代码。
欢呼和好运学习C#
答案 2 :(得分:0)
for (int i = 0; i < GlobalVariable.total; i++)
GlobalVariable.total
为0,因此该循环永远不会运行。将total
设置为10,或更改为:
for (int i = 0; i < GlobalVariable.staff.Count; i++)
此外,人员阵列中没有实际元素,因此无论如何都无法正常工作。