由于其保护级别,财产无法进入

我需要发布到多行TextBox 。 数据来自单独类中的不同方法。

 class converter { public static void convert(object source, FileSystemEventArgs f) { //... some job done now post this data to winforms Form1.textBox1 = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; } } 

我无法从这个类访问textBox1 。 它说:

由于其保护级别,Form1.textBox1’无法访问
非静态字段,方法或属性Form1.textBox1’需要对象引用

Form1可能是表单类型的名称,而不是Form1实例变量的名称。 由于convert可能是从Form1中的一个实例方法调用的,因此您可以移动

调用者而不是在转换中引入依赖

 convert.convert(...); textbox1 = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; 

您可以将TextBox更改为public,传递Form1的实例,但这些方法违反了封装的基本租户,类转换器不应该知道Form1及其控件的任何内容。

更好的方法是类转换器定义一个事件,如果调用者希望得到通知,并且在转换器类完成其工作后更新内部(textBox),则该类将调用该事件。

 class converter { public delegate void OnCopyComplete(string file); public event OnCopyComplete CopyComplete; public static void convert(object source, FileSystemEventArgs f) { //... some job done now NOTIFY the caller if(CopyComplete != null) CopyComplete(source.ToString()); } } 

并在Form1实例中

 // tell to the converter class that this class wants to be notified when the work is finished converter.CopyComplete += new converter.OnCopyComplete(UpdateMyLabels); converter.convert(....); public void UpdateMyLabels(string file) { TextBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; } 

转到Form1并在控件属性中生成TextBox1 Public(按F4)并将属性modifiersFriend更改为Public

之后。 您可以执行以下操作:

  Form1 form1 = new Form1; form1.TextBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; 

你可以做到这一点的一种方法是在表单中有一个字段:

 public static TextBox textBox; 

并将其设置为form_load中的文本框:

 this.textBox = textBox1; 

然后在上面的方法中,将其称为:

 Form1.textBox.Text = ... 

完整的工作示例:

 using System; using System.Windows.Forms; namespace StackOverflowWin { public partial class Form1 : Form { public static TextBox textBox; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { textBox = textBox1; TestClass.StaticMethod(); } } public static class TestClass { public static void StaticMethod() { Form1.textBox.Text = "works"; } } } 

您确实应该使用表单的现有实例:

 var form = Form.ActiveForm as Form1; if (form != null) { form.textBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine"; } 

你应该实际使用事件,这是更合适的设计,但上面应该工作。

设置属性:Modifier = Public

需要这样的东西:

 Form1.Invoke(new Action(delegate(){ textBox1.Text = "MyText"})); 

如果代码不正确,请道歉,但它足够接近让您开始使用谷歌。

如果上述方法不起作用,则可能:

 Form1.textBox1.Text.Invoke(new Action(delegate(){textBox1.Text="MyText"})); 

我不记得究竟是怎么做的。

也许这个:

 Invoke(new Action(() => { Form1.textBox1.Text = "MyString"; })); 

为什么不将表单包含为静态方法的参数,如:

 class converter { public static void convert(object source, FileSystemEventArgs f, Form frm) { //... some job done now post this data to winforms frm.textbox1 = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; } 

但请确保您的Texbox在Form1中是公开的

  public static TextBox textBox1; 

编辑

因此,如果您不想要公共文本框,那么您必须在Form1中创建一个public和static属性,并在传递表单之前传递文本框的值,如:

  public static String fromTextBox { get; set; } 

然后在Form1中另外将文本框的值保存到fromTextBox属性:

  fromTextBox = textBox1.Text; 

所以,您现在可以像这样访问它:

  class converter { public static void convert(object source, FileSystemEventArgs f, Form frm) { //... some job done now post this data to winforms frm.fromTextBox = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine; }