Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 属性由于其保护级别而无法访问_C#_.net_Winforms - Fatal编程技术网

C# 属性由于其保护级别而无法访问

C# 属性由于其保护级别而无法访问,c#,.net,winforms,C#,.net,Winforms,我需要发布到多行文本框。数据来自单独类中的不同方法 class converter { public static void convert(object source, FileSystemEventArgs f) { //... some job done now post this data to winforms Form1.textBox1 = "File Copied" + " " +

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

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'


转到
表单1
并在控件属性中使
文本框1
公开(点击F4) 并将属性
修饰符
朋友更改为公共

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

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

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

public static TextBox textBox;
var form = Form.ActiveForm as Form1;

if (form != null)
{
     form.textBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine";
}
并将其设置为表单_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";
        }
    }
}

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

public static TextBox textBox;
var form = Form.ActiveForm as Form1;

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

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

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

而不是在convert中引入依赖项

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

需要这样的东西:

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

Set property:Modifier=Public

您可以将文本框更改为Public,传递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());
   }
}
在表格1中

// 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;
}

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

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;
}
但请确保您的文本框在表单1中是公开的

        public static TextBox textBox1;
编辑

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

 public static String fromTextBox { get; set; }
然后,在Form1中,将textbox的值保存到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;
 }

您确定您的文本框名为textbox1而不是textbox1吗?了解您需要正确设置内容也可能很有用,例如:Form1.textBox1.Text=“MyText”;是的,你是对的,我错了。但现在的错误是:Form1.textBox1由于其保护级别而不可访问。它不应该是Form1.textBox1.text而不仅仅是Form1。textbox1@harhar:我试过,它给了我编辑中的错误above@AdamK Dean-我怀疑OP也在尝试跨线程更改它,这意味着如果没有调用,该方法将无法工作。如果表单已经实例化了怎么办?在这种情况下,此解决方案不起作用。除非他有表单变量引用,否则此解决方案将不起作用。他只有类型Form1,而不是Form1。它说非staic字段需要一个对象引用,这就是我不想在文本框上启用public的要点,正如Steve所说,这不是一个好方法idea@user726720您可能会创建一个单独的公共和静态属性来存储文本框。请参阅上面的编辑。我有开始/停止按钮。所以,如果我说开始,控制转移到一个不同的类,用我的方法来做一些工作,它永远不会真正转移回来,直到我说停止。因此,现在在按下start之后,当作业被激活时,我希望数据被写入forms classtextbox1中的多行文本框,由于它的保护,无法访问level@user726720这是控件的默认属性,可以通过进入包含指定控件的窗体的“设计”视图来解决,然后将控件的Modifiers属性更改为Public或Internal.+1以表示封装。类方法应该将结果返回到表单。