Изменение текста в одной форме, из другой формы

Я пытаюсь изменить текст в 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();
    }
}

Когда я нажимаю кнопку, ничего не происходит, текст остается прежним.

Изменение текста в одной форме, из другой формы

Добавьте f1.Show(), чтобы вы могли видеть измененный текст.

Hans Passant 11.12.2020 11:51

Спасибо, не знал об этом, но есть ли способ обновить текст в Form1, не открывая новое окно?

Umar 11.12.2020 11:54

Отвечает ли это на ваш вопрос? Как получить доступ к элементу управления формы для другой формы?

user12031933 11.12.2020 12:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
349
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Есть несколько способов сделать это здесь 2 примера

  1. В этом примере используются ссылки без использования событий.

    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 используйте это для установки желаемого значения.

  1. В этом примере используются события

     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

Stefano Cavion 11.12.2020 16:00

Другие вопросы по теме