2

我需要发布到多行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'

4

8 回答 8

1

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

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

convert.convert(...);
textbox1 = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") +
           Environment.NewLine;
于 2013-05-24T08:06:00.343 回答
1

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

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

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;
}
于 2013-05-24T08:12:16.667 回答
0

将需要这样的东西:

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

如果代码不正确,我们深表歉意,但它足以让您开始使用 google。

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

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

我不记得它是如何完成的。

也许是这样:

Invoke(new Action(() =>
{
    Form1.textBox1.Text = "MyString";
}));
于 2013-05-24T08:07:43.123 回答
0

设置属性:Modifier = Public

于 2013-05-24T08:08:31.680 回答
0

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

var form = Form.ActiveForm as Form1;

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

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

于 2013-05-24T08:05:14.857 回答
0

转到Form1TextBox1在控件属性中设置为 Public(按 F4)并将属性modifiersFriend更改为Public

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

 Form1 form1 = new Form1;
 form1.TextBox1.Text = "File Copied" + "  " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine;
于 2013-05-24T08:03:13.667 回答
0

您可以这样做的一种方法是在表单中有一个字段:

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";
        }
    }
}
于 2013-05-24T08:03:59.017 回答
0

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

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 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;
 }
于 2013-05-24T08:15:00.133 回答