2009-11-18 2 views
1

Я пытаюсь связать Textbox.Text с номером Form.Text (который устанавливает название формы). Работает сама привязка. Но название не обновляется, пока я не переведу всю форму.Текстовое поле для привязки к форме. Текст (заголовок)

Как я могу достичь обновленного Form.Text, не перемещая форму? Я бы хотел, чтобы Form.Text обновлялся непосредственно, когда я ввожу что-то в текстовое поле.

Редактировать; Я поставил заголовок формы в случае TextChanged, который обжигали на 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; 
} 

и версия Databinding:

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

Edit 2: Я вижу, что я забыл упомянуть кое-что. Не знаю, добавляет ли он что-либо, но мое приложение является MDI-приложением. Часть заголовка, которая изменяет это:

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

Действительно странно. Я никогда не наблюдал никаких проблем с перерисованием при прямом настройке свойства Form.Text. Можете ли вы поделиться с нами некоторым фрагментом кода? –

ответ

3

Классическая проблема, вы не обновляя текст существующей формы в но новый, который не виден. Вызывается метод Show() после изменения текста.

Source

Вы также можете попробовать недействительности свою форму в случае TextChanged так вынудит перекрасить.

Edit 1: Это StackOverflow question может дать ответ на вас, так как вы это приложение MDI

Edit 2: Это может быть, что эта операция не поточно-и, следовательно, поток пользовательского интерфейса блокирует , Следовательно, вам нужно будет вызвать функцию, чтобы вызвать ее обновление. У меня была аналогичная проблема с ярлыками StatusBar некоторое время назад. Вот пример кода, если вы не знаете, как использовать делегатов:

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

Что об использовании события TextChanged в TextBox, например:

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

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

Это приводит к тому же поведению, что и в моем Вопросе. Таким образом, текст обновляется, когда я перемещаю/изменяю размер формы. – MysticEarth

+0

Не знаю, что сказать вам тогда, я создал простое приложение только с этим кодом, и у меня не было проблем. Кажется, это случай: «Эй, он работает на моей машине». Извините, я не могу вам помочь дальше ... –

0

У меня была такая же проблема, что и меня просто отвлекало. В конце концов я обнаружил, что мой запрос на обновление названия формы с помощью «this.text =» был заблокирован методом «WndProc (ref message message)». В конце метода WndProc я добавил «base.WndProc (ref message)», который также проходит по всем сообщениям на базу. После этого я смог успешно обновить свой заголовок формы «this.text =».

Поэтому я предлагаю вам искать метод, который блокирует ваше название формы для обновления.

0

Ни один из традиционных предметов не работал (недействителен & обновить); и я не мог легко определить, где сообщение могло быть заблокировано. Однако спящий поток позаботился об этом.

fForm1->Text = Title; 

Thread::Sleep(0); //Allow release for title to update 
Смежные вопросы