2009-02-25 6 views
0

J'essaie d'ouvrir un nouveau formulaire à partir d'un gestionnaire d'événements dans le formulaire principal dans un programme C#. Le gestionnaire d'événements est appelé correctement et il ouvre le nouveau formulaire, mais le nouveau formulaire est figé et ne remplit même pas initialement.Ouverture d'un nouveau formulaire à partir du gestionnaire d'événements dans le formulaire principal Coups App

Je peux créer un bouton sur le formulaire principal et faire créer le nouveau formulaire après avoir cliqué sur le bouton, mais il ne fonctionne pas correctement lorsqu'il est exécuté à partir du gestionnaire d'événements.

Le gestionnaire d'événements n'a pas besoin de connaître les résultats de tout ce qui a été fait sur le formulaire qu'il a créé. Il doit simplement le créer et se déconnecter.

Que dois-je faire? Le nouveau formulaire doit fonctionner indépendamment du formulaire principal.

est ici où je définir le gestionnaire d'événements:

ibclient.RealTimeBar += new EventHandler<RealTimeBarEventArgs>(ibclient_RealTimeBar); 

Voici le code de gestionnaire d'événements:

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e) 
{ 
    FancyForm a_fancy_form = new FancyForm(); 
    a_fancy_form.Show(); 
} 

Création d'une nouvelle forme via un clic de bouton fonctionne très bien:

private void button7_Click(object sender, EventArgs e) 
{ 
    FancyForm a_fancy_form = new FancyForm(); 
    a_fancy_form.Show(); 
} 
+0

Veuillez ajouter votre code là où vous créez et en affichant le nouveau formulaire. – VBNight

Répondre

2

Pouvez-vous poster le code du gestionnaire d'événements? .. Est-ce que l'événement est levé dans un thread séparé, puis l'interface utilisateur principale?

Edit:
Je ne sais pas ce que la barre en temps réel fait, mais essayez de vérifier un InvokeRequired sur votre formulaire afin que vous puissiez créer la forme secondaire sur le même fil que l'interface utilisateur principale ..

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e) 
{ 
    if(this.InvokeRequired) 
    { 
     this.Invoke(((Action)() => ShowFancyForm())); 
    } 

    ShowFancyForm(); 
} 

FancyForm a_fancy_form; 
private void ShowFancyForm() 
{ 
    if(null != a_fancy_form)return; 

    a_fancy_form = new FancyForm(); 
    a_fancy_form.Show(); 
} 

de Bien sûr, cela utilise des raccourcis sales et suppose 3.5 mais vous pouvez modifier à vos besoins.

J'ai également déplacé la déconnexion de FancyForm en dehors de la portée de la méthode .. encore une fois ajuster à vos besoins. Savez-vous quel thread est en cours d'exécution dans le gestionnaire d'événements?

+0

Nice one, Quintin –

0

Je crois que cela devrait être le fil principal de l'interface graphique.

+0

Il n'y a pas de chance. Cela doit être. – Quibblesome

2

J'ai eu exactement le problème même, j'ai utilisé le code de Quintin et il fonctionne bien maintenant ....

J'ai fait quelques changements afin de travailler avec le framework 2.0, voici ce que je l'ai fait: D'abord, i créé un délégué, montrant à la méthode qui ouvre la forme:

public delegate void pantallazo(); 
pantallazo obj=new pantallazo(this.ShowFancyForm); 

le procédé qui ouvre la forme est identique à celui fourni par Quintin:

smatiCliente a_fancy_form; //smatiCliente is the name of my new form class... 
    private void ShowFancyForm() 
    { 
     if (null != a_fancy_form) return; 
     a_fancy_form = new smatiCliente(); 
     this.Hide(); 
     a_fancy_form.Show(); 
    } 

et dans le gestionnaire d'événements de mon programme, y a fait quelques changements simples:

if(this.InvokeRequired) 
        { 
         this.Invoke(obj); 
        } 
        ShowFancyForm(); 

Et c'est tout, ça marche très bien maintenant. La méthode Invoke exécute le délégué approprié, de sorte que le formulaire est maintenant créé sous l'interface utilisateur principale.

Espérons que cela fonctionne, et merci beaucoup Quintin!

Questions connexes