Как получить доступ к управлению текстовым полем Winform из другого класса?
У меня есть winform
, называемый Form1 и textbox
, называемый textBox1
В Form1 я могу установить текст, набрав:
textBox1.text = "change text";
Теперь я создал другой класс. Как я могу назвать textBox1 в этом классе?
поэтому я хочу изменить текст для textBox1 в этом классе.
Как я могу получить доступ к Form1 из этого нового класса?
Ответы
Ответ 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 должен быть общедоступным.