Как получить доступ к элементу управления текстовым полем Winform из другого класса? - PullRequest
31 голосов
/ 13 апреля 2011

У меня есть winform с именем Form1 и textbox с именем textBox1

В Form1 Я могу установить текст, набрав:

textBox1.text = "change text";

Теперь я создал еще один класс. Как мне вызвать textBox1 в этом классе? поэтому я хочу изменить текст для textBox1 в этом классе.

Как я могу получить доступ к Form1 из этого нового класса?

Ответы [ 14 ]

41 голосов
/ 13 апреля 2011

Я бы порекомендовал, чтобы вы этого не сделали.Вы действительно хотите иметь класс, который зависит от того, как редактирование текста реализовано в форме, или вы хотите механизм, позволяющий вам получать и устанавливать текст ?

Iпредложил бы последнее.Итак, в вашей форме создайте свойство, которое переносит свойство 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

}
12 голосов
/ 06 апреля 2013

Я также столкнулся с той же проблемой, когда я не смог добавить текст в richTextBox класса Form.Поэтому я создал метод с именем 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");
        }        
    }
6 голосов
/ 07 июня 2016

Вы можете изменить модификатор доступа для сгенерированного поля в Form1.Designer.cs с private на public. Изменить это

private System.Windows.Forms.TextBox textBox1;

этим

public System.Windows.Forms.TextBox textBox1;

Теперь вы можете справиться с этим, используя ссылку вида Form1.textBox1.

Visual Studio не будет перезаписывать это, если вы внесете какие-либо изменения в свойства элемента управления, если только вы не удалите его и не создадите заново.

Вы также можете изменить его из пользовательского интерфейса, если вам неудобно редактировать код напрямую. Найдите свойство Modifiers:

Modifiers

1 голос
/ 21 июня 2016

Я пробовал приведенные выше примеры, но ни один не работал так, как описано. Тем не менее, у меня есть решение, которое объединено из некоторых примеров:

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

Это работает, если вы не используете потоки. Использование потоков потребовало бы больше кода и не требовалось для моей задачи.

1 голос
/ 25 февраля 2013

Я нашел простой способ сделать это, я проверил, все работает правильно. Сначала я создал проект Windows, в форме я вставил TextBox и назвал его textBox1 Затем я вставил кнопку с именем button1, затем добавил класс с именем class1. в классе 1 я создал 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 в другой форме или классе.

1 голос
/ 13 апреля 2011

Определите свойство формы как, затем используйте это в других местах, где оно будет доступно с экземпляром формы

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}
1 голос
/ 13 апреля 2011

Вам понадобится некоторый доступ к экземпляру формы, чтобы получить доступ к его коллекции Controls и, таким образом, изменить текст Text Box's.

Одним из способов может быть то, что у вас может быть доступный экземпляр формы.как Public или более лучший Создайте новый конструктор для вашей второй формы и попросите его получить экземпляр Form1 во время инициализации.

0 голосов
/ 25 сентября 2018
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
0 голосов
/ 10 декабря 2017
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");
    }
}

Мне нравится это решение.

0 голосов
/ 19 января 2017

Я использовал этот метод для обновления метки, но вы можете легко изменить его на текстовое поле:

Класс:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...