如何在c#中以不同的形式使用类类型数组

时间:2014-05-12 14:11:25

标签: c# arrays

我是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;
        }
    }
}

3 个答案:

答案 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++)

此外,人员阵列中没有实际元素,因此无论如何都无法正常工作。