如何从另一个类访问Winform文本框控件?

时间:2011-04-13 09:18:26

标签: c# winforms class inheritance controls

我的winform名为 Form1 textbox名为 textBox1

Form1 中,我可以通过输入以下内容来设置文字:

textBox1.text = "change text";

现在我创建了另一个类。如何在此课程中调用 textBox1 ? 所以我想在此课程中更改 textBox1 的文字。

如何从这个新课程中访问 Form1

15 个答案:

答案 0 :(得分:41)

我建议你不要。你真的想要一个依赖于文本编辑在表单中的实现方式的类,或者你想要一种允许你获取和设置文本的机制吗?

我会建议后者。因此,在您的表单中,创建一个包含相关Text控件的TextBox属性的属性:

public string FirstName
{
    get { return firstNameTextBox.Text; }
    set { firstNameTextBox.Text = value; }
}

接下来,创建一些机制,通过该机制,类可以获取对表单的引用(例如,通过构造函数)。然后该类可以使用该属性来访问和修改文本:

class SomeClass
{
    private readonly YourFormClass form;
    public SomeClass(YourFormClass form)
    {
        this.form = form;
    }

    private void SomeMethodDoingStuffWithText()
    {
        string firstName = form.FirstName;
        form.FirstName = "some name";
    }
}

更好的解决方案是在接口中定义可能的交互,并让该接口成为表单与其他类之间的契约。这样,该类与表单完全分离,并且可以使用任何实现接口(这为更容易测试打开了大门):

interface IYourForm
{
    string FirstName { get; set; }
}

在您的表单类中:

class YourFormClass : Form, IYourForm
{
    // lots of other code here

    public string FirstName
    {
        get { return firstNameTextBox.Text; }
        set { firstNameTextBox.Text = value; }
    }
}

......和班级:

class SomeClass
{
    private readonly IYourForm form;
    public SomeClass(IYourForm form)
    {
        this.form = form;
    }

    // and so on

}

答案 1 :(得分:12)

我也遇到了同样的问题,我无法将appendText附加到Form类的richTextBox。所以我创建了一个名为update的方法,在那里我用来传递来自Class1的消息。

class:Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }
        public static Form1 _Form1;

        public void update(string message)
        {
            textBox1.Text = message;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 sample = new Class1();            
        }
    }

class:Class1.cs

public class Class1
    {        
        public Class1()
        {
            Form1._Form1.update("change text");
        }        
    }

答案 2 :(得分:6)

您可以将Form1.Designer.cs中生成的字段的访问修饰符从private更改为public。改变这个

private System.Windows.Forms.TextBox textBox1;

由此

public System.Windows.Forms.TextBox textBox1;

您现在可以使用Form1.textBox1形式的参考来处理它。

如果对控件属性进行任何更改,Visual Studio将不会覆盖此对象,除非您将其删除并重新创建它。

如果您不能直接编辑代码,也可以从UI中获取它。查找Modifiers属性:

Modifiers

答案 3 :(得分:1)

您需要具有对表单实例的访问权限才能访问其Controls集合,从而更改Text Box's文本。

其中一种方法可能是您可以将您的表单的实例作为公共或更多更好地为您的第二个表单创建一个新的构造函数并让它在初始化期间接收Form1的实例。

答案 4 :(得分:1)

定义表单的属性,然后在其他地方使用它,它可以使用表单实例

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}

答案 5 :(得分:1)

我找到了一种简单的方法,我已经对它进行了测试,它运行正常。 首先,我在表单I Inserted TextBox上创建了一个Windows项目,并将其命名为textBox1 然后我插入了一个名为button1的按钮,然后添加一个名为class1的类。 在class1中我创建了一个TextBox:

class class1
    {
     public static TextBox txt1=new TextBox();  //a global textbox to interfece with      form1
    public static void Hello()
      {
       txt1.Text="Hello";
      }
    }

现在在你的表格中执行此操作:

public partial class Form1 : Form
    {
     public Form1()
     {
      InitializeComponent();  
     }
     private void button1_Click(object sender, EventArgs e)
      {
       class1.txt1=textBox1;
       class1.Hello();
       }
    }

在button1_Click中我将对象textBox1变为txt1,所以现在txt1具有属性 textBox1和你可以在另一种形式或类中更改textBox1文本。

答案 6 :(得分:1)

我尝试了上面的例子,但没有一个像上面描述的那样工作。但是,我有一个解决方案,结合了一些例子:

public static Form1 gui;
public Form1()
{
    InitializeComponent();
    gui = this;
    comms = new Comms();

}
public Comms()
{
    Form1.gui.tsStatus.Text = "test";
    Form1.gui.addLogLine("Hello from Comms class");
    Form1.gui.bn_connect.Text = "Comms";
}

只要您不使用线程,这就有效。使用线程需要更多代码,而我的任务不需要。

答案 7 :(得分:0)

如果您的其他类继承了Form1,并且您的textBox1被声明为public,那么您只需调用以下命令即可从其他类访问该文本框:

otherClassInstance.textBox1.Text = "hello world";

答案 8 :(得分:0)

使用全局变量或属性将值赋给文本框,在另一个类中给出变量的值,并将其分配给表单类中的textbox.text。

答案 9 :(得分:0)

Form1 form = new Form1(); 
form.textBox1.Text = "test";

答案 10 :(得分:0)

我使用此方法更新标签,但您可以轻松将其更改为文本框:

<强>类别:

public Class1
{
    public Form_Class formToOutput;

    public Class1(Form_Class f){
        formToOutput = f;
    }

    // Then call this method and pass whatever string
    private void Write(string s)
    {
        formToOutput.MethodToBeCalledByClass(s);
    }
}

构成将进行更新的方法:

public Form_Class{

    // Methods that will do the updating
    public void MethodToBeCalledByClass(string messageToSend)
    {
       if (InvokeRequired) { 
           Invoke(new OutputDelegate(UpdateText),messageToSend); 
       }
    }

    public delegate void OutputDelegate(string messageToSend);
    public void UpdateText(string messageToSend)
    {
       label1.Text = messageToSend;
    }
}

<强>最后

只需通过构造函数传递表单:

Class1 c = new Class1(this);

答案 11 :(得分:0)

public partial class Form1 : Form
{

    public static Form1 gui;
    public Form1()
    {
        InitializeComponent();
        gui = this;

    }
    public void WriteLog(string log)
    {
        this.Invoke(new Action(() => { txtbx_test1.Text += log; }));

    }
}
public class SomeAnotherClass
{
    public void Test()
    {
        Form1.gui.WriteLog("1234");
    }
}

我喜欢这个解决方案。

答案 12 :(得分:0)

Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";

答案 13 :(得分:0)

// 将 Active 表单转换为表单变量。

Form F1 = myForm1.ActiveForm;

//找出控件并更改属性

F1.Controls.Find("Textbox1", true).ElementAt(0).Text= "Whatever you want to write";

答案 14 :(得分:-1)

怎么样?

Form1.textBox1.text =“更改文字”;

请注意: 1.您必须将Form1“包含”到您的第二个表单源文件中 使用Form1;

  1. textBox1应该是公开的