我需要发布到多行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'
需要对象引用
答案 0 :(得分:1)
Form1
可能是表单类型的名称,而不是Form1
实例变量的名称。
由于convert
可能是从Form1中的一个实例方法调用的,因此可以移动
到调用者而不是在转换中引入依赖
convert.convert(...);
textbox1 = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") +
Environment.NewLine;
答案 1 :(得分:1)
您可以将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;
}
答案 2 :(得分:0)
转到Form1
并在控件属性中设置TextBox1
Public(点击F4)
并将属性modifiers
从朋友更改为公开
之后。您可以执行以下操作:
Form1 form1 = new Form1;
form1.TextBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine;
答案 3 :(得分: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";
}
}
}
答案 4 :(得分:0)
您确实应该使用表单的现有实例:
var form = Form.ActiveForm as Form1;
if (form != null)
{
form.textBox1.Text = "File Copied" + " " + DateTime.Now.ToString("HH:mm:ss tt") + Environment.NewLine";
}
你应该实际使用事件,这是更合适的设计,但上面应该有效。
答案 5 :(得分:0)
需要这样的东西:
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";
}));
答案 6 :(得分:0)
设置属性:Modifier = Public
答案 7 :(得分: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属性,并在传递表单之前传递文本框的值,如:
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;
}