Caixa de texto do banco de dados para form.text (título)
-
20-09-2019 - |
Pergunta
Estou tentando ligar um Textbox.Text
para Form.Text
(que define o título do formulário). A própria ligação funciona. Mas, o título não é atualizado até que eu mova todo o formulário.
Como posso alcançar Form.Text
sendo atualizado sem mover o formulário? Eu gostaria Form.Text
sendo atualizado diretamente quando digito algo na caixa de texto.
Editar; Definei o título do formulário em um evento de textchanged, que é disparado por uma caixa de ferramentas:
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;
}
E a versão do banco de dados:
public partial class ProjectForm : Form
{
public ProjectForm()
{
this.projectName.TextBox.DataBindings.Add("Text", this, "Text", true, DataSourceUpdateMode.OnValidation);
}
}
Edit 2: Vejo que esqueci de mencionar algo. Não sei se acrescenta alguma coisa, mas minha aplicação é um aplicativo MDI. A parte do título que muda é:
ApplicationName [THIS CHANGES, BUT ONLY AFTER MOVING/RESIZING]
Solução
Problema clássico, você não está atualizando a propriedade de texto do formulário existente, mas uma nova que não é visível. Ligue para o método show () depois de alterar o texto.
Você também pode tentar invalidar seu formulário no evento TEXTCHANGED, para forçar uma re-pintura.
Editar 1: este Pergunta de Stackoverflow Pode fornecer uma resposta para você, pois você é um aplicativo MDI
Editar 2: Pode ser que essa operação não seja segura para roscas e, portanto, o encadeamento da interface do usuário está bloqueando. Portanto, você precisa invocar Outra função para fazer com que a atualize. Eu tive um problema semelhante com os rótulos de status de status há algum tempo. Aqui está algum código de exemplo se você não souber usar os delegados:
public delegate void updateFormTextD(string text);
private void formText(string text)
{
this.Text = text;
}
private void updateFormText(string text)
{
Invoke(new updateFormTextD(formText), text);
}
Outras dicas
Que tal usar o evento TEXTCHANGED da caixa de texto, como este:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
this.Text = this.textBox1.Text;
}
}
Eu tive o mesmo problema que quase me assusta. Eventualmente, descobri que minha solicitação de atualização de título do formulário por "this.Text =" foi bloqueada pelo método "WNDPROC (mensagem ref)". No final do método WNDPROC, adicionei "base.wndproc (mensagem ref)", que passa por todas as mensagens para a base também. Depois disso, eu poderia atualizar com sucesso meu título de formulário por "this.text =".
Portanto, sugiro que você procure um método que bloqueie o título do seu formulário para ser atualizado.
Nenhum dos itens tradicionais funcionou (invalidado e atualização); Nem pude determinar prontamente onde a mensagem poderia ter sido bloqueada. No entanto, dormir o fio cuidou disso.
fForm1->Text = Title;
Thread::Sleep(0); //Allow release for title to update