C# 如何从另一个类访问Winform textbox控件?

C# 如何从另一个类访问Winform textbox控件?,c#,winforms,class,inheritance,controls,C#,Winforms,Class,Inheritance,Controls,我有一个winform名为Form1和一个textbox名为textBox1 在表格1中,我可以通过键入以下内容来设置文本: textBox1.text = "change text"; 现在我创建了另一个类。在这门课上我怎么称呼textBox1? 因此,我想在这个类中更改textBox1的文本 如何从这个新类访问表单1?您需要对表单的实例具有一定的访问权限,才能访问其控件的集合,从而更改文本框的文本 其中一种方法是,您可以将窗体实例作为公共实例提供,或者更好地为第二个窗体创建一个新构造函数,

我有一个
winform
名为Form1和一个
textbox
名为textBox1

表格1中,我可以通过键入以下内容来设置文本:

textBox1.text = "change text";
现在我创建了另一个类。在这门课上我怎么称呼textBox1? 因此,我想在这个类中更改textBox1的文本


如何从这个新类访问表单1

您需要对表单的实例具有一定的访问权限,才能访问其
控件的
集合,从而更改
文本框的
文本


其中一种方法是,您可以将窗体实例作为公共实例提供,或者更好地为第二个窗体创建一个新构造函数,并让它在初始化期间接收窗体1的实例

如果您的另一个类继承Form1,并且您的textBox1声明为公共,则您可以通过调用以下命令从另一个类访问该文本框:

otherClassInstance.textBox1.Text = "hello world";
那怎么办

Form1.textBox1.text=“更改文本”

注: 1.您必须通过以下方式将Form1“包含”到第二个表单源文件中: 使用表格1

  • textBox1应该是公共的

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

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

    使用全局变量或属性将值分配给textbox,在另一个类中为变量提供值,并将其分配给textbox.text表单类。

    我建议您不要这样做。您真的想要一个依赖于表单中文本编辑实现方式的类,还是想要一个允许您获取和设置文本的机制

    我建议后者。因此,在您的表单中,创建一个属性来包装所讨论的
    TextBox
    控件的
    Text
    属性:

    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";
        }
    }
    
    更好的解决方案是在接口中定义可能的交互,并让该接口成为表单和其他类之间的契约。这样,类与表单完全解耦,并且可以使用任何实现接口的方法(这为更容易的测试打开了大门):

    在你的课堂上:

    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
    
    }
    

    我找到了一个简单的方法,我已经测试过了,它工作正常。 首先,我创建了一个Windows项目,在表单上插入了一个TextBox,并将其命名为textBox1 然后我插入了一个名为button1的按钮,然后添加了一个名为class1的类。 在class1中,我创建了一个文本框:

    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\u Click中,我将对象textBox1复制到txt1中,因此现在txt1具有属性
    textBox1和u的组合可以在另一个窗体或类中更改textBox1文本。

    我也面临同样的问题,无法将文本附加到窗体类的richTextBox。因此,我创建了一个名为
    update
    的方法,用于传递来自Class1的消息

    类别: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();            
            }
        }
    
    班级:Class1.cs

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

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

    private System.Windows.Forms.TextBox textBox1;
    
    由此

    public System.Windows.Forms.TextBox textBox1;
    
    现在可以使用
    Form1.textBox1
    格式的引用来处理它

    如果对控件属性进行任何更改,VisualStudio将不会覆盖此内容,除非您将其删除并重新创建

    如果不能直接编辑代码,也可以从UI更改它。查找“修改器”属性:


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

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

    只要不使用线程,这种方法就有效。使用线程将需要更多的代码,我的任务不需要这些代码。

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

    类别:

    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;
        }
    }
    
    形成将进行更新的方法:

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

    我喜欢这个解决方案。

    //将活动表单转换为表单变量

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

    //查找CONTROL并更改属性


    F1.Controls.Find(“Textbox1”,true).ElementAt(0).Text=“无论您想写什么”

    假设textBox1是静态成员。你应该在你的回答中提到这一点。很好,但是这片土地将居住在哪里。。如果它在
    Form1
    类中
    时,您仍然需要
    实例
    来获取此属性+1看起来很棒。。这是一个很好的和答案的组合。我如何调用类的构造函数
    SomeClass
    IYourForm
    接口传递给它?嗨!但在这种情况下,您仍然传输表单对象,所以SomeClass代码并没有与表单代码隔离?此模式是否允许将输出转发到控制台?或者我应该使用什么来制作完全独立的记录器?@GennadyG
    SomeClass
    不直接依赖于表单代码:它依赖于
    IYourForm
    接口,它可能是表单,也可能是完全不同的东西。@GennadyG此讨论偏离了这个问题的主题,因此,我建议将其作为一个单独的问题(在搜索可能已经被问过和回答过的类似问题之后):-)嗨,欢迎来到StackOverflow。请仔细考虑一下你的答案(特别是,如果你有4年的时间来想出一个答案),因为解释总是有助于从错误中学习。嗨,克里斯,欢迎来到StAccess!为了帮助别人理解你的答案,考虑一下你的代码的简短描述以及它是如何解决问题的。你能更具体地问一下你的问题吗?
    Form frm1 = new Form1();
    frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";