我对C#比较新,而且有点卡住了。
我在表单上有一个Rich Textbox,我想将其从不同的类更新到表单本身。
我第一次尝试
Form1.outputTextbox.AppendText(string);
但文本框无法访问,有意义。所以我试着做一个功能。在Form1上我创建了函数
public void updateTextBox(string new_text)
{
outputTextBox.AppendText(new_text);
}
在我使用的课程中。
Form1.updateTextBox("apple");
我遇到的问题是我的类可以看到函数的唯一方法是,如果我将它设为静态函数,但是当我这样做时会出现错误"非静态需要对象引用字段,方法或属性'成员'"
我完全接近或者走错路吗?任何帮助都会被批评。
答案 0 :(得分:1)
或者,您可以执行以下操作。这利用了自定义参数和事件。
namespace WindowsFormsApplication3
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
public partial class Form1 : Form
{
TextBox textBox;
SomeClass someClass;
public Form1()
{
InitializeComponent();
Initialize();
BindComponents();
}
private void BindComponents()
{
//EventHandlers
this.Load += new EventHandler(Form1_Load);
this.someClass.TextUpdatedEvent += new EventHandler(someClass_TextUpdatedEvent);
}
void someClass_TextUpdatedEvent(object sender, EventArgs e)
{
this.textBox.Text = (e as FormArgs).Text;
}
private void Initialize()
{
this.textBox = new TextBox();
this.someClass = new SomeClass();
}
void Form1_Load(object sender, EventArgs e)
{
this.Controls.Add(textBox);
}
}
public class SomeClass
{
public event EventHandler TextUpdatedEvent = delegate { };
public void UpdateText(string text)
{
if (TextUpdatedEvent != null)
{
TextUpdatedEvent(this, new FormArgs() { Text = text });
}
}
}
public class FormArgs : EventArgs
{
public string Text { get; set; }
}
}
如果您这样做,您可以像这样更新表单文本:
someClass.UpdateText("changing the text on the form");
答案 1 :(得分:0)
您正尝试从类而不是对象访问该函数。 使用
Form1 myForm = new Form1();
...
myForm.updateTextBox("whatever");
此处还要注意线程问题。什么触发外部代码?这是另一个行动,那么一切都很顺利。它是否来自另一个线程,那么你必须处理它。
答案 2 :(得分:0)
通过构造函数或属性将Form1实例传递给另一个类。然后,您可以从其他类访问outputTextbox。
public class OtherClass
{
private Form1 form1;
public OtherClass(Form1 form1)
{
this.form1 = form1;
}
private void ChangeText()
{
form1.outputTextBox.AppendText("hello world");
}
}
从Form1.cs实例化OtherClass并传递其实例。 在Form1.cs中:
OtherClass obj = new OtherClass(this);
答案 3 :(得分:0)
我知道已经很晚了,但是也许有人需要解决方案... 您可以通过将其作为参数传递给构造函数而无需创建对象即可从另一种形式访问所有控制器...
例如
public partial class Form2 : Form
{
MainForm mainForm;
public Form2(MainForm mainForm)
{
InitializeComponent();
this.mainForm = mainForm;
txtRecive00.TextChanged += new EventHandler(txtRecive8changed);
}
void txtRecive8changed(object sender, EventArgs e)
{
mainForm.txtRecive1.Text += txtRecive00.Text;
}
就我而言,我可以从Form2更新mainForm.txtRecive1.Text
中的文本...
在MineForm中,我们像这样从Form2创建对象:
Form2 f2 = new FormMeasure(this);
有关更多信息,请显示此短片https://www.youtube.com/watch?v=CdH8z_JNi_U