Текстовое поле привязки данных к Form.Text (заголовок) - PullRequest
1 голос
/ 18 ноября 2009

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

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

Edit; Я устанавливаю заголовок формы в событии 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;
}

И версия привязки данных:

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

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

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

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

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

Источник

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

Изменить 1: Этот вопрос StackOverflow может дать вам ответ, поскольку вы являетесь приложением MDI

Редактировать 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 голос
/ 18 ноября 2009

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

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

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        this.Text = this.textBox1.Text;
    }
}
0 голосов
/ 13 февраля 2011

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

fForm1->Text = Title;

Thread::Sleep(0); //Allow release for title to update
0 голосов
/ 13 апреля 2010

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

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

...