2010-05-12 71 views
0

我有一个表格多行textInput。我需要从表单外的对象更新textInput的内容。更新文本输入外部形式

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

回答

1

看看MVP模式 - 你可以让你的表单实现一个IView接口。你的另一个对象是当演示文稿发生变化时(或让你的视图订阅演示者事件 - 我更喜欢使用方法的方法)时,演示者会调用例如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 }); 
    } 

}

1

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

非常简单的解决方案: 给你的表单一个公共SetTextValue(字符串文本)方法,它设置文本。

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

+0

感谢您的回复...和我怎么从外部对象到“Form1的”对象的引用? – xain 2010-05-12 16:03:17

+1

您可以创建演示者(MVP)来更新表单。演示者在构造函数中获取表单的实例和“外部对象”(模型)。演示者订阅模型上的某些事件。当适当的事件被触发时,演示者可以更新表单。 – 2010-05-12 16:11:00

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

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

+0

感谢您的回复,实际上DataBindigs方法就是我所需要的。它不工作,绑定应该在哪里?我试图把它放在Form的构造器和_Load方法中,但没有运气。 – xain 2010-05-12 16:11:39

+1

如果你想使用数据绑定,我会从这里开始阅读:http://msdn.microsoft.com/en-us/library/c8aebh9k.aspx 对于数据绑定控件更新时,它绑定的对象更改该对象将需要实现INotifyPropertyChanged。 – 2010-05-12 16:33:18