Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从表单外部更新textInput_C#_Forms_Textinput - Fatal编程技术网

C# 从表单外部更新textInput

C# 从表单外部更新textInput,c#,forms,textinput,C#,Forms,Textinput,我有一个带有多行textInput的表单。我需要从表单外部的对象更新textInput的内容 我怎样才能做到这一点?我应该使用事件还是将textInput传递给外部对象的构造函数?我不会将文本传递给对象。如果只需要它作为初始化值,那么将文本传递给表单的构造函数就可以了。但并非相反 SomeFormClass form1 = new SomeFormClass(aString); form1.Show(); 非常简单的解决方案: 为表单提供一个公共SetTextValue(字符串文本)方法,用于

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


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

我不会将文本传递给对象。如果只需要它作为初始化值,那么将文本传递给表单的构造函数就可以了。但并非相反

SomeFormClass form1 = new SomeFormClass(aString);
form1.Show();
非常简单的解决方案: 为表单提供一个公共SetTextValue(字符串文本)方法,用于设置文本


事件也可以工作,但对于这样一个简单的问题来说似乎有点力不从心。

我不会将文本传递给对象。如果只需要它作为初始化值,那么将文本传递给表单的构造函数就可以了。但并非相反

非常简单的解决方案: 为表单提供一个公共SetTextValue(字符串文本)方法,用于设置文本


事件也会起作用,但对于这样一个简单的问题来说似乎有点力不从心。

有很多方法可以实现这一点,具体取决于您所做的工作

是否从表单中更新文本字段

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

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

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

是否从表单中更新文本字段

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

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

看看MVP模式-您可以让表单实现IView接口。您的另一个对象将是Presenter,它将在某些内容发生更改时调用IView.UpdateText()(或者让您的视图订阅presenters事件-我更喜欢方法方法)

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

表单应该检查this.invokererequired==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 });
  }

}

看看MVP模式-您可以让表单实现IView接口。您的另一个对象将是Presenter,它将在某些内容发生更改时调用IView.UpdateText()(或者让您的视图订阅presenters事件-我更喜欢方法方法)

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

表单应该检查this.invokererequired==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 });
  }

}

谢谢您的回复。。。如何从外部对象获取对“Form1”对象的引用?您可以创建一个presenter(MVP)来更新表单。演示者在窗体的构造函数中获取窗体和“外部对象”(模型)的实例。演示者订阅模型上的某些事件。当相应的事件被触发时,演示者可以更新表单。感谢您的回复。。。如何从外部对象获取对“Form1”对象的引用?您可以创建一个presenter(MVP)来更新表单。演示者在窗体的构造函数中获取窗体和“外部对象”(模型)的实例。演示者订阅模型上的某些事件。当适当的事件被触发时,演示者可以更新表单。感谢您的回复,实际上我需要的是DataBings方法。但它不起作用,绑定应该放在哪里?我尝试将其放入表单的构造函数和_Load方法中,但没有成功。如果您想使用数据绑定,我将开始阅读以下内容:要使数据绑定控件在绑定到的对象发生更改时更新,该对象将需要实现INotifyPropertyChanged。感谢您的回答,实际上,我需要的是DataBings方法。但它不起作用,绑定应该放在哪里?我尝试将其放入表单的构造函数和_Load方法中,但没有成功。如果要使用数据绑定,我将从这里开始阅读:要使数据绑定控件在绑定到的对象发生更改时更新,该对象需要实现INotifyPropertyChanged。