2010-12-07 43 views
0

Plus précisément en regardant la méthode "Arriv" dans la classe Customer. J'utilise une boucle for pour créer des instances de la classe client, et lorsque j'essaie d'écrire leurs heures d'arrivée dans un textBox (juste à des fins de test) la boîte de texte ne se met pas à jour. Pourquoi est-ce?TextBox ne se met pas à jour en C#

Ceci est juste un petit projet de simulation pour ma classe informatique. Il est à ses débuts, et est probablement faux dans beaucoup d'endroits!

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; 
      } 
     } 
    } 
} 
+0

Avez-vous essayé le débogage? Ma supposition est client [i] .TimeArrived(). ToString() est juste une chaîne vide à chaque fois. – Peter

+0

Même lorsque j'ajoute + "Test"; pour cela, il n'affiche rien. –

+0

Trouvé le problème, voir la réponse ci-dessous. Veuillez cocher la bonne réponse s'il y en a une. – Peter

Répondre

0

Passez à l'arrivée de l'instance de l'objet textbox créé sur votre Form1.

public void Arrive(TextBox displayArrival) 

Pourquoi héritez-vous Form1 dans Initialiserz? Il est préférable de passer la référence à Form1 au lieu de l'héritage dans ce cas.

+0

Je suis assez élémentaire, donc je ne sais pas trop comment faire. –

+0

Je reçois erreur \t Aucune surcharge pour la méthode 'Arrive' prend 0 arguments lorsque j'implémente ce code que vous m'avez donné –

0

Cela semble trop complexe. Essayez de modéliser le monde réel. Qu'est-ce que Initialisers et pourquoi avez-vous un arbre d'héritage: Client> Initialisers> Form1?

Votre client écrit dans son propre TextBox, au lieu du TextBox que vous regardez (celui du Formulaire visible).

Pourquoi ne pas avoir une méthode Arrive qui définit un champ privé à DateTime.Now. Ensuite, demandez au client son TimeArrived, qui renvoie ce champ. Dans votre formulaire, appelez ces méthodes autant que nécessaire dans votre boucle.

Cette commande seperaties également (Arrive) de la requête (TimeArrived) + conserve votre héritage plus logique.

Vous n'avez peut-être même plus besoin d'initialiseurs. Et ne laissez pas le client hériter du formulaire, car un client n'est pas un formulaire.

0

Je pense qu'il y a plus d'un problème de conception ici, vous créez des instances de client à l'intérieur du client.

Votre client Arriver méthode devrait probablement être une fonction à l'intérieur d'une autre classe, comme ci-dessous, le client devrait simplement définir ce qu'est un client. Les traiter devrait être traité par une classe différente.

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();    
} 

Mais pour la zone de texte problème, vous devrez exposer une propriété dans la classe de formulaire et définissez comme ça,

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

Je suis un peu confus ici. Que se passe-t-il dans la classe client maintenant que j'ai une classe processCustomers? –