0

我有一个带有 multiline 的表单textInput。我需要textInput从表单外的对象更新内容。

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

4

3 回答 3

1

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

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

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

于 2010-05-12T15:55:00.343 回答
1

有很多方法可以实现这一点,具体取决于您正在处理的具体情况。

从表单中更新文本字段?

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");

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

于 2010-05-12T15:55:42.353 回答
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 });
  }

}

于 2010-05-12T15:57:15.190 回答