Я пытаюсь изменить текст в Form1 при нажатии кнопки на Form2
Форма 2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.textCh = "Text has been changed";
}
}
Форма 1:
public partial class Form1 : Form
{
public string textCh {
get
{
return this.textCh;
}
set
{
this.label1.Text = value;
}
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
}
Когда я нажимаю кнопку, ничего не происходит, текст остается прежним.
Спасибо, не знал об этом, но есть ли способ обновить текст в Form1, не открывая новое окно?
Отвечает ли это на ваш вопрос? Как получить доступ к элементу управления формы для другой формы?
Также этот дубликат: Взаимодействие между формами — Как поменять элемент управления формы с другой формы?
Есть несколько способов сделать это здесь 2 примера
В этом примере используются ссылки без использования событий.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var frm = new Form2(this);
frm.Show();
}
}
здесь Form2
создается с передачей Form1
в качестве параметра
public partial class Form2 : Form
{
Form1 _parent;
public Form2(Form1 parent)
{
_parent = parent;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var lbl = (Label)_parent.Controls.Find("label1", false).First();
lbl.Text = "new text";
_parent.Update();
}
}
Затем Form2
используйте это для установки желаемого значения.
В этом примере используются события
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var frm = new Form2();
frm.UpdateLabelEvent += Frm_UpdateLabelEvent;
frm.Show();
}
private void Frm_UpdateLabelEvent(string str)
{
label1.Text = str;
}
}
а вот и код Form2
public partial class Form2 : Form
{
public event Action<string> UpdateLabelEvent;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
UpdateLabelEvent("new string value");
}
}
В вашей Form1 ничего не меняется, потому что вы сначала создаете новую форму Form1 и меняете там текст. Новая форма Form1 никогда не отображается, поэтому вы не видите никаких изменений.
Решение
private void button1_Click(object sender, EventArgs e)
{
//Form1 f1 = new Form1(); GET rid of this line
f1.textCh = "Text has been changed";
}
вам нужно убедиться, что f1 известен в форме2, если вы не знаете, как это сделать, вот простой способ
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.f1 = this;
f2.ShowDialog();
}
public Form2()
{
public Form1 f1 { get; set; }
...
Другой способ передачи Form1 в Form2 через метод Show()
и свойство .Owner
:
// In Form1
Form2 f2 = new Form2();
f2.ShowDialog(this); // <-- pass Form1 via "this"
Затем в Form2 вы выполняете CAST .Owner
для ввода Form1:
// In Form2
Form1 f1 = this.Owner as Form1;
if (f1!=null && !f1.IsDisposed)
{
f1.textCh = "Text has been changed";
}
спасибо, вы на самом деле научили меня чему-то новому, о чем я даже не подозревал :D
Добавьте f1.Show(), чтобы вы могли видеть измененный текст.