2012-08-14 152 views
1

"view = new Person"放在按钮事件处理程序中是否可以使用?如果我不这样做,并将其放在Form1构造函数中,则只会添加最后一个值。如果我想声明一个新实例并将其添加到我的Arraylist中,那么这是否是正确的方法?在窗体中声明C#类对象

private ArrayList store; 

    public Form1() 
    { 
     InitializeComponent(); 
     store = new ArrayList(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //Is it okay to declare a new instance of the Person class 
     // with each button push?    
     Person view = new Person(); 
     view.firstname = txtFirstName.Text; 
     view.lastname = txtLastName.Text; 
     store.Add(view); 
     txtFirstName.Clear(); 
     txtLastName.Clear(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     foreach (Person display in store) 
     { 
      MessageBox.Show(display.ToString()); 
     } 
    } 
+1

是的,这看起来像*完全*你想做什么。我怀疑你的按钮标有“创建新人”或什么的,对吧? – 2012-08-14 19:03:27

+1

'store'应该是'List '而不是'ArrayList' – Lee 2012-08-14 19:04:14

+0

是的,没关系。因为您要添加对ArrayList的引用,所以不会丢失该实例。 – 2012-08-14 19:04:15

回答

5

是否还好放置该按钮事件处理程序中“视图=新的人”?

是的。如果您的目标是每次点击按钮时都会创建一个新用户,那么这是适合的。

附注:您应该考虑使用List<Person>而不是ArrayList。这是更新的,类型安全的列表类(从.NET 2.0开始),并且更好用。

0

这看起来像刚好你应该做的。

我想你应该在某处避免做一些复杂的事情,比如在窗体的事件处理程序中实例化对象。这听起来像一个称为“模型 - 视图 - 控制器”的应用程序设计模式,为了实现它,您将拥有一个类,与您的WinForm分离,包含单击按钮时应执行的逻辑,以及表单的控件被链接到这个Controller的方法,而不是包含它自己的处理程序的表单。它有它的优点,但对于普通的小项目来说并不是必需的。继续做你正在做的事情,这很好。

有几件事情:首先,除非在.NET 1.1中编码,否则ArrayList通常不是好东西。从.NET 2.0开始,这种语言引入了一种称为泛型的概念,泛型允许您执行的主要任务之一是指定集合可以包含的对象的类型。 System.Collections.Generics.List<T>类是store的更好选择,如果它将存储的是People;将声明更改为private List<Person> store;。使用泛型集合的好处在于,需要返回对象的代码将知道对象是什么类型,因为集合将禁止向其添加不同类型的对象。

其次,在定义事件处理程序之前,将它们放入设计器中时命名按钮。代码应该是自我记录的,而名为“button1”的按钮并不告诉我们应该做什么。如果在将其从“工具箱”拖动到窗体上后将其命名为“CreatePersonButton”,那么当您双击它来定义其行为时,事件处理程序将被命名为“CreatePersonButton_Click”,这更具描述性。