2009-11-18 4 views
1

J'essaie de lier un Textbox.Text à Form.Text (qui définit le titre du formulaire). La liaison elle-même fonctionne. Mais, le titre n'est pas mis à jour jusqu'à ce que je déplace le formulaire entier.Databinding Textbox à Form.Text (titre)

Comment puis-je obtenir Form.Text en cours de mise à jour sans déplacer le formulaire? Je voudrais Form.Text étant mis à jour directement lorsque je tape quelque chose dans la zone de texte.

Modifier; Je mets le titre du formulaire dans un événement TextChanged qui est tiré par un ToolStripTextbox:

public partial class ProjectForm : Form 
{ 
    public ProjectForm() 
    { 
     // my code contains all sorts of code here, 
     // but nothing that has something to do with the text. 
    } 
} 

private void projectName_TextChanged_1(object sender, EventArgs e) 
{ 
    this.Text = projectName.TextBox.Text; 
} 

Et la version Databinding:

public partial class ProjectForm : Form 
{ 
    public ProjectForm() 
    { 
     this.projectName.TextBox.DataBindings.Add("Text", this, "Text", true, DataSourceUpdateMode.OnValidation); 
    } 
} 

Edit 2: Je vois que j'oublié de mentionner quelque chose. Je ne sais pas si cela ajoute quelque chose, mais mon application est une application MDI. La partie du titre qui change est:

ApplicationName [THIS CHANGES, BUT ONLY AFTER MOVING/RESIZING] 
+1

Vraiment étrange. Je n'ai jamais observé aucun problème de repaint lors de la définition directe de la propriété Form.Text. Pouvez-vous partager un extrait de code avec nous? –

Répondre

3

problème classique, vous n'êtes pas mettre à jour le texte du formulaire existant propriété mais une nouvelle qui n'est pas visible. Appelez la méthode Show() après avoir modifié le texte.

Source

Vous pouvez également essayer votre formulaire invalidant en cas TextChanged il forcera une nouvelle peinture.

Edit 1: Cette StackOverflow question peut fournir une réponse pour vous puisque vous êtes une application MDI

Edit 2: Il se pourrait que cette opération est thread-safe et donc le thread d'interface utilisateur bloque . Par conséquent, vous devez invoquer une autre fonction afin de provoquer la mise à jour. J'ai eu un problème similaire avec StatusBar Labels il y a quelques temps. Voici un exemple de code si vous ne savez pas comment utiliser les délégués:

public delegate void updateFormTextD(string text); 

private void formText(string text) 
{ 
    this.Text = text; 
} 

private void updateFormText(string text) 
{ 
    Invoke(new updateFormTextD(formText), text); 
} 
1

Qu'en est-il en utilisant l'événement TextChanged de la zone de texte, comme ceci:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     this.Text = this.textBox1.Text; 
    } 
} 
+0

Il en résulte le même comportement que décrit dans ma question. Ainsi, le texte est mis à jour lorsque je déplace/redimensionne le formulaire. – MysticEarth

+0

Je ne sais pas quoi vous dire alors, j'ai créé une application simple avec juste ce code et je n'ai eu aucun problème. Il semble que ce soit un cas de: "Hé, ça marche sur ma machine." Désolé, je ne peux pas vous aider plus loin ... –

0

J'ai eu le même problème qui me fait presque flipper. Finalement, j'ai trouvé que la demande de mise à jour de mon titre de formulaire par "this.text =" était bloquée par la méthode "WndProc (ref Message message)". À la fin de la méthode WndProc j'ai ajouté "base.WndProc (ref message)", qui transmet également tous les messages à la base. Après cela, je pourrais mettre à jour mon titre de formulaire avec succès par "this.text =".

Par conséquent, je vous suggère de rechercher une méthode qui bloque le titre de votre formulaire pour être mis à jour.

0

Aucun des éléments traditionnels travaillés (invalider & refresh); Je n'ai pas non plus été capable de déterminer facilement où le message aurait pu être bloqué. Cependant, dormir le fil a pris soin de cela.

fForm1->Text = Title; 

Thread::Sleep(0); //Allow release for title to update