【问题标题】:Databinding Textbox to Form.Text (title)将文本框数据绑定到 Form.Text(标题)
【发布时间】:2009-11-18 14:52:25
【问题描述】:

我正在尝试将Textbox.Text 绑定到Form.Text(设置表单的标题)。 绑定本身有效。但是,在我移动整个表单之前,标题不会更新。

如何在不移动表单的情况下更新Form.Text?我希望在文本框中输入内容时直接更新 Form.Text

编辑;我在由 ToolStripTextbox 触发的 TextChanged 事件中设置了表单的标题:

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]

【问题讨论】:

  • 真的很奇怪。直接设置 Form.Text 属性时,我从未观察到任何重绘问题。你能和我们分享一些代码sn-p吗?

标签: c# winforms data-binding textbox title


【解决方案1】:

经典问题,您不会更新现有表单的 Text 属性,而是更新不可见的新属性。更改文本后调用 Show() 方法。

Source

您也可以尝试在 TextChanged 事件中使表单无效,以便强制重新绘制。

编辑1:这个StackOverflow question可能会为你提供答案,因为你是一个MDI应用程序

编辑 2: 此操作可能不是线程安全的,因此 UI 线程处于阻塞状态。因此,您需要调用另一个函数以使其更新。不久前,我在 StatusBar Labels 上遇到了类似的问题。如果您不知道如何使用委托,这里是一些示例代码:

public delegate void updateFormTextD(string text);

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

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

【讨论】:

    【解决方案2】:

    使用TextBox的TextChanged事件怎么样,像这样:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            this.Text = this.textBox1.Text;
        }
    }
    

    【讨论】:

    • 这会导致与我的问题中描述的行为相同的行为。因此,当我移动/调整表单大小时,文本会更新。
    • 那时不知道该告诉你什么,我只用该代码创建了一个简单的应用程序,我没有遇到任何问题。这似乎是一个案例:“嘿,它在我的机器上工作。”对不起,我不能再帮你了...
    【解决方案3】:

    我遇到了同样的问题,几乎把我吓坏了。最终我发现“this.text =”的表单标题更新请求被“WndProc(ref Message message)”方法阻止。在 WndProc 方法的末尾,我添加了“base.WndProc(ref message)”,它也将所有消息传递给基。之后,我可以通过“this.text =”成功更新我的表单标题。

    因此,我建议您寻找一种方法来阻止您的表单标题被更新。

    【讨论】:

      【解决方案4】:

      传统项目都不起作用(无效和刷新);我也无法轻易确定消息可能被阻止的位置。然而,休眠线程解决了这个问题。

      fForm1->Text = Title;
      
      Thread::Sleep(0); //Allow release for title to update
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 2012-07-09
        • 1970-01-01
        相关资源
        最近更新 更多