Подтвердить что ты не робот

Как получить доступ к управлению текстовым полем Winform из другого класса?

У меня есть winform, называемый Form1 и textbox, называемый textBox1

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

textBox1.text = "change text";

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

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

4b9b3361

Ответ 1

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

Я бы предложил последнее. Итак, в вашей форме создайте свойство, которое обертывает свойство Text элемента управления TextBox:

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

Затем создайте некоторый механизм, через который ваш класс может получить ссылку на форму (например, через contructor). Затем этот класс может использовать свойство для доступа и изменения текста:

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

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

Еще лучше было бы определить возможные взаимодействия в интерфейсе, и пусть этот интерфейс будет заключаться между вашей формой и другим классом. Таким образом, класс полностью отделен от формы и может использовать anyting, реализующий интерфейс (который открывает дверь для более легкого тестирования):

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

}

Ответ 2

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

Ответ 3

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

private System.Windows.Forms.TextBox textBox1;

этим

public System.Windows.Forms.TextBox textBox1;

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

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

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

Модификаторы

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

Если ваш другой класс наследует Form1, и если ваш textBox1 объявлен общедоступным, вы можете получить доступ к этому текстовому полю из своего другого класса, просто позвонив:

otherClassInstance.textBox1.Text = "hello world";

Ответ 9

Используйте глобальную переменную или свойство для назначения значения в текстовое поле, укажите значение для переменной в другом классе и назначьте ее textbox.text в классе формы.

Ответ 10

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

Ответ 11

Вот как я решил это после борьбы за это.

У меня есть глобальный класс, который я могу использовать по всему проекту

 public class GlobalVariables
    {
        public static Form MainFormO;
    }

Я добавил это в основную форму (по умолчанию: Form1)

 public MainFrm()
        {
            InitializeComponent();
            GlobalVariables.MainFormO = this;
        }

И я пишу этот код в классе, я хочу получить доступ к элементу в MainForm. Вы можете просто изменить Listbox на текстовое поле или что угодно.

 GlobalVariables.MainFormO.Invoke((MethodInvoker)delegate
                {
                    ListBox listboxObject= Application.OpenForms["MainFrm"].Controls["listboxid"] as ListBox;
                    Debug.WriteLine(listboxObject.Items.Add("New Line"));
                });

Ответ 12

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

Класс:

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

Ответ 13

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

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

Ответ 14

Что насчет

Form1.textBox1.text = "изменить текст";

Примечание: 1. вы должны "включить" Form1 в свой второй исходный файл формы используя Form1;

  • textBox1 должен быть общедоступным.