从表单外部更新 textInput

Posted

技术标签:

【中文标题】从表单外部更新 textInput【英文标题】:Update textInput from outside its form 【发布时间】:2011-02-18 17:02:45 【问题描述】:

我有一个包含多行 textInput 的表单。我需要从表单外的对象更新textInput 的内容。

我怎样才能做到这一点?我应该使用事件,还是将textInput 传递给外部对象的构造函数?

【问题讨论】:

【参考方案1】:

看看 MVP 模式 - 你可以让你的表单实现一个 IView 接口。您的另一个对象将是 Presenter,例如,当某些事情发生变化时会调用 IView.UpdateText()(或者让您的视图订阅演示者事件 - 我更喜欢方法方法)。

这将您的关注点分开并使您的解决方案更具可测试性,因为您可以模拟 IView、IPresenter 和 IModel 的实现。

表单应检查是否this.InvokeRequired == true 以确定传入请求是否在 UI 线程上。如果不是,您将需要使用委托。

public delegate void UpdateTextDelegate(string text);

public void UpdateText(string text)

  // Check we are on the right thread.
  if (!this.InvokeRequired)
  
      // Update textbox here
  
  else
  
      UpdateTextDelegate updateText = new UpdateTextDelegate(this.UpdateText);

      // Executes a delegate on the thread that owns the control's underlying window handle.
      this.Invoke(updateText, new object[]  text );
  

【讨论】:

【参考方案2】:

我不会将文本传递给对象。如果您只需要它作为初始化值,将文本传递给表单的构造函数就可以了。但不是其他方式。

非常简单的解决方案: 为您的表单提供一个设置文本的公共 SetTextValue(string Text) 方法。

事件也可以,但对于这样一个简单的问题似乎有点过分了。

【讨论】:

感谢您的回复...如何从外部对象中获取对“Form1”对象的引用? 您可以创建一个演示者 (MVP) 来负责更新表单。演示者在其构造函数中获取表单的一个实例和您的“外部对象”(模型)。演示者订阅模型上的一些事件。当适当的事件被触发时,演示者可以更新表单。【参考方案3】:

根据您工作的具体情况,有很多方法可以实现这一点。

从表单中更新文本字段?

txtField.Text = someObject.SomeProperty;

在表单的构造函数中设置值?

SomeFormClass form1 = new SomeFormClass(aString);
form1.Show();

从外部对象调用表单上的方法?

public void SetText(string text)  txtField.Text = text; 

form1.SetText(aString);

使用数据绑定?

txtField.DataBindings.Add(new Binding("Text", someObject, "SomeProperty");

不知道更多细节很难回答。

【讨论】:

感谢您的回复,实际上 DataBindigs 方法正是我所需要的。但它不起作用,绑定应该去哪里?我尝试将它放入表单的构造函数和 _Load 方法中,但没有成功。 如果你想使用数据绑定,我会从这里开始阅读:msdn.microsoft.com/en-us/library/c8aebh9k.aspx 要让数据绑定控件在绑定到的对象发生更改时更新,该对象需要实现 INotifyPropertyChanged。跨度>

以上是关于从表单外部更新 textInput的主要内容,如果未能解决你的问题,请参考以下文章

使用链接发送到表单的变量从表单外部的链接提交表单?

Angular2 - 从外部验证和提交表单

如何将变量从外部 JavaScript 传递到 HTML 表单

从表单元素外部的输入标签中读取

从 vb.net 中的表单外部获取突出显示的文本

使用模态表单更新数组中的对象并显示更新的详细信息