2010-05-20 3 views
1

Il s'agit du code modifié que j'ai trouvé sur ce site. Lorsque l'ajout de texte à une TextBox et à InvoveRequired est faux, le texte s'affiche dans la boîte mais la prochaine fois que la fonction est appelée et InvokeRequired est vraie, la chaîne de texte placée par le premier appel est perdue (""). Plusieurs appels lorsque InvokeRequired est vrai fonctionnent comme prévu. ComBox est un type TextBox avec multline = true.TextBox perd du texte lorsque InvokeRequired == false

Toute aide serait appréciée.

public void LogComText(string comText, bool newline) 
    { 
     if (comBox.InvokeRequired) 
     { 

      comBox.BeginInvoke(new Action(delegate 
      { 
       LogComText(comText, newline); 
      })); 
      return; 
     } 
     comBox.AppendText(comText); 
     if (newline) comBox.AppendText(Environment.NewLine); 


    } 
+0

C'est ... pourrait vous suprising créer un court mais * programme complet * qui illustre le problème? –

+0

Je dirais certainement que quelque part dans votre programme vous faites un 'combBox.Text =" "' ou quelque chose de similaire. – Oliver

Répondre

2

Cela semble fonctionner, peut-être que cela a quelque chose à voir avec la concurrence.
Essayez d'utiliser comBox.Invoke(...) au lieu de comBox.BeginInvoke(...)
Mise à jour: La chose est lorsque vous utilisez BeginInvoke les appels de méthode ne peut être invoquée hors d'usage.
C'était faux, les appels à Invoke et BeginInvoke sont exécutés dans l'ordre.

Edit:
Il que le travail assurez-vous Indifférent Fume ne disposons pas d'autre endroit où vous modifiez le texte dans comBox.

Si cela ne fonctionne toujours pas, vous devrez peut-être créer un verrou pour vous assurer que vous n'avez pas deux threads en train d'écrire simultanément dans la zone de texte.

Quelque chose comme ceci:

private static readonly object _comBoxSyncObj = new object(); 
public void LogComText(string comText, bool newline) 
{ 
    if (comBox.InvokeRequired) 
    { 
     comBox.Invoke(new Action(delegate 
     { 
      LogComText(comText, newline); 
     })); 
     return; 
    } 
    lock (_comBoxSyncObj) 
    { 
     comBox.AppendText(comText); 
     if(newline) comBox.AppendText(Environment.NewLine); 
    } 
} 

Edit2:
Si le problème persiste, vous pouvez ajouter un gestionnaire d'événements pour l'événement TextChanged et mettre un point d'arrêt dans à soi quand la zone de texte d'être effacé.

Ajouter cette méthode et un eventhandler pour TextChanged sur Combox:

private void comBox_TextChanged(object sender, EventArgs e) 
{ 
    if (comBox.TextLength == 0) 
    { 
     // Set a breakpoint here. 
     Trace.WriteLine("TextBox empty"); 
    } 
} 
+0

Invoke et beginInvoke ont le même résultat. Je vais essayer la serrure et poster. – Tom

+0

Control.BeginInvoke, "Exécute un délégué de manière asynchrone sur le thread sur lequel le handle sous-jacent du contrôle a été créé." BeginInvoke ajoute simplement un message à la file d'attente pour le thread d'interface utilisateur. Ces messages seront traités dans l'ordre dans lequel ils ont été créés. – hemp

+0

@hemp, vous avez raison. J'ai pensé à 'ThreadPool.QueueUserWorkItem'. –

Questions connexes