2010-08-07 4 views
2

Je suis novice en programmation windows.forms. J'ai commencé à faire une application qui a le flux d'événements suivante:Emplacement du code dans windows.forms

  • cliquez sur un bouton qui ouvre un fichier - extraire son contenu dans une liste de chaînes - visitez certains sites - analyser leur contenu - etc.

Donc parce que tout dans mon application se passe après avoir cliqué sur un bouton pour ouvrir un fichier, j'ai mis tout mon code sur l'événement de clic du bouton. Cependant, je sais que c'est une mauvaise pratique de codage, parce que j'ai réalisé que j'ai fini par avoir tout le flux du programme à l'intérieur de cet événement de clic. Je sais que l'événement ne doit contenir que du code lié au bouton, mais où placer le code qui suit, sinon à l'intérieur de l'événement? Y at-il un autre événement que je devrais utiliser au lieu d'écrire tout simplement dans le bouton clic?

J'espère avoir clarifié ma question. Sinon, je vais réessayer d'expliquer mon problème. Je ne sais tout simplement pas où écrire le code qui suit l'événement click. Si je le mets dedans:

public Form1() 
{ 
    InitializeComponent(); 
} 

.. alors il s'exécute avant l'événement de clic qui est faux.

Merci d'avance.

Répondre

4

La méthode standard consiste à écrire une ou plusieurs méthodes qui exécutent l'action et à appeler celles de l'événement click. Pour les actions de longue durée, faites-les dans un thread de travail en arrière-plan.

Par exemple:

public void myButton_OnClick(EventArgs e, object sender) 
{ 
    VisitWebSites(); 
} 

private void VisitWebSites() 
{ 
    var webSiteList = GetWebSitesFromFile(); 
    foreach (var w in webSiteList) { 
     StartVisitingWebSite(w); 
    } 
} 

private IEnumerable<string> GetWebSitesFromFile() 
{ 
    // whatever 
} 

private void StartVisitingWebSite(string url) 
{ 
    backgroundWorker1.RunWorkerAsync(url); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string url = (string)e.Argument; 
    e.Result = VisitWebSite(url); 
} 

private string VisitWebSite(string url) 
{ 
    // This is called in background thread. Do whatever you do to return data. 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error || e.Cancelled) 
     return; 

    string result = e.Result.ToString(); 

    // Do whatever you do with the result 
} 

Regardez la documentation BackgroundWorker pour voir comment réaliser des actions dans un thread d'arrière-plan, puis manipuler leurs résultats.

+0

excellente réponse - vous m'avez expliqué clairement, m'a aidé à comprendre l'extrait en nommant correctement les méthodes, et m'a également donné une leçon de multithreading. merci beaucoup! –

1

Vous pouvez encapsuler tout le travail que vous souhaitez effectuer dans une autre fonction de la classe du formulaire. Son accès de modification serait privé bien sûr (sauf si vous voulez qu'une autre classe puisse accéder à la méthode). Depuis l'intérieur de votre gestionnaire d'événements button_click, vous pouvez appeler cette nouvelle fonction. C'est le moyen le plus simple de le faire. Sinon, vous pouvez utiliser l'exemple fourni dans le lien ci-dessus par @Robert S.

Questions connexes