TextBox未在C#中更新

时间:2010-12-07 10:24:33

标签: c# loops for-loop static-classes

具体查看Customer类中的arrival方法。我使用for循环来创建客户类的实例,当我尝试将它们的到达时间写到textBox(仅用于测试目的)时,文本框不会更新。这是为什么?

这只是我的Computing类的一个小型模拟项目。它还处于早期阶段,在很多地方可能都是错误的!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace QueueSimulation
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("The form has loaded");
        }

        public void goButton_Click(object sender, EventArgs e)
        {
            Initialisers init = new Initialisers();

            Customer customer = new Customer();

            customer.Arrive();
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            // put code here to break out of the program
        }
    }

    public class Customer : Initialisers
    {
        int waitingTime;
        int arrivalTime;
        int arrivalInterval;

        Initialisers init = new Initialisers();


        public void Arrive()
        {
            Customer[] customer = new Customer[1000];
            int counter = 0;
            for (int i = 1; i <= 10; i++)
            {
                customer[i] = new Customer();
                customer[i].TimeArrived();
                displayArrival.Text = displayArrival.Text + customer[i].TimeArrived().ToString();
                // Implement something to either show the time in the queue if needed
                Thread.Sleep(init.CustomerArriveTime*100);
            }
            MessageBox.Show("All of the customers have arrived");
        }

        public string TimeArrived()
        {
            return Convert.ToString(DateTime.Now);
        }

        public void Leave()
        {

        }

        public void GetServed()
        {

        }
    }

    public class Server
    {
        bool servingStatus;
        int servingTime;

        public void Serve()
        {

        }
    }

    public class Initialisers : Form1
    {
        private int cust_no = 3;

        public int CustomerArriveTime
        {
            get
            {
                return cust_no;
            }
            set
            {
                cust_no = value;
            }
        }

        private int s_time = 4;

        public int serveTime
        {
            get
            {
                return s_time;
            }
            set
            {
                s_time = value;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

传递到Form1上创建的文本框对象的实例。

public void Arrive(TextBox displayArrival)

为什么要在Initialiserz中继承Form1?在这种情况下,最好将引用传递给Form1而不是继承。

答案 1 :(得分:0)

这似乎过于复杂。尝试模拟现实世界。什么是Initialisers,为什么有继承树:Customer&gt;初始化器&gt; Form1中?

您的客户正在写入自己的TextBox,而不是您正在查看的TextBox(可见的Form中的TextBox)。

为什么没有方法Arrive将私有字段设置为DateTime.Now。然后,向客户询问其TimeArrived,它返回此字段。在表单中,根据循环中的需要调用这些方法。

这也是来自查询(TimeArrived)的seperaties命令(Arrive)+使您的继承更加合理。

您甚至可能不再需要Initialisers。并且不要让客户从表继承,因为客户不是表格。

答案 2 :(得分:0)

我认为这里存在更多的设计问题,您正在创建客户内部的客户实例。

您的客户Arrive方法可能应该是另一个类中的函数,如下所示,客户应该只定义客户是什么。处理它们应该由不同的类处理。

class Customer
{
    int waitingTime;         
    int arrivalTime;         
    int arrivalInterval; 

    // etc...
}

class ProcessCustomers
{
    pubic void Arrive()
    {
        // etc...
    }
}

public void goButton_Click(object sender, EventArgs e)            
{                
     Initialisers init = new Initialisers();                    
     ProcessCustomers CustomerQueue = new ProcessCustomers();                    
     CustomerQueue .Arrive();            
}  

但是对于文本框问题,您必须在表单类中公开一个属性并将其设置为,

string ArrivalTime
{    
    get     
    {       
       return textBox1.Text;    
    }    
    set    
    {       
       textBox1.Text = value;    
    } 
}