TextBox не обновляется в C # - PullRequest
0 голосов
/ 07 декабря 2010

В частности, глядя на метод прибытия в классе Customer.Я использую цикл for для создания экземпляров класса клиента, и когда я пытаюсь записать время их прибытия в textBox (только для целей тестирования), текстовое поле не обновляется.Почему это так?

Это небольшой проект для моего класса по вычислительной технике.Это на ранних стадиях, и, вероятно, во многих местах это неправильно!

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 голосов
/ 07 декабря 2010

Это кажется слишком сложным.Попробуйте смоделировать реальный мир.Что такое Initialisers, и почему у вас есть дерево наследования: Customer> Initialisers> Form1?

Ваш клиент пишет в свой собственный TextBox, а не в TextBox, который вы просматриваете (тот, что изФорма, которая видна).

Почему бы не иметь метод Arrive, который устанавливает частное поле в DateTime.Now.Затем спросите Клиента его TimeArrived, который возвращает это поле.В вашей форме вызывайте эти методы столько раз, сколько необходимо в вашем цикле.

Эта также команда seperaties (Arrive) из запроса (TimeArrived) + сохраняет ваше наследование более логичным.

Возможно, вы даже неНужны инициализаторы больше.И не позволяйте Клиенту наследовать от Формы, потому что Клиент не Форма.

0 голосов
/ 07 декабря 2010

Я думаю, что здесь есть еще одна проблема дизайна, вы создаете экземпляры клиентов внутри клиента.

Ваш метод 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;    
    } 
} 
0 голосов
/ 07 декабря 2010

Передайте в Arrive экземпляр объекта текстового поля, созданного в вашей форме Form1.

public void Arrive(TextBox displayArrival)

Почему вы наследуете Form1 в Initialiserz? В этом случае лучше передать ссылку на Form1, а не наследование.

...