Обновите значение в каждой форме, если оно было изменено - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь изменить одну метку на несколько форм. Ярлык обновляется во время изменений в одной форме, но он должен быть связан с ярлыком для других форм. Это означает, что если label1 в форме 1 отображает 10, а I go для формы 2, он также должен отображать 10 label2. Если метка обновляется до 11 в форме 2, а я go возвращается в форму 1, она должна отображать 11. Я никогда не делал этого раньше и не могу придумать какой-либо код для этого. Есть ли способ сделать это?

form 1

form2 frm2 = new form2 (); frm2.LabelText = this.button1.Text;

form2

publi c string LabelText {get {return this.totalChips.Text; } set {this.totalChips.Text = value; }}

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я бы передал объект конструктору. Объект, содержащий некоторые свойства, и когда это свойство установлено, он инициирует событие для всех слушателей, которые затем могут обновить свой экран. Преимущество этого метода в том, что Form2 не зависит от Form1 (развязан). Form2 по-прежнему можно использовать, например, в Form3, если вызывающий объект передает действительный объект DataObject.

Вот пример использования INotifyPropertyChanged

I have 2 forms.
- form1 has a TextBox and two buttons (one is Set Title property, the other is open form2)
- form2 has a Label, which is only showing the property.

So form1 set the property of the data object, form2 listens to the propertychanged event.

public partial class Form1 : Form
{
    private readonly DataObject _dataObject = new DataObject();

    public Form1()
    {
        InitializeComponent();
    }

    private void buttonOpenForm2_Click(object sender, EventArgs e)
    {
        // pass the DataObject into the constructor.
        var form2 = new Form2(_dataObject);
        form2.Show();
    }

    private void buttonSetTitle_Click(object sender, EventArgs e)
    {
        _dataObject.Title = textBox1.Text;
    }
}

public partial class Form2 : Form
{
    private DataObject _dataObject;

    // here the dataobject is passed to this form
    public Form2(DataObject dataObject)
    {
        InitializeComponent();

        _dataObject = dataObject;
        _dataObject.PropertyChanged += DataObject_PropertyChanged;

        // deregister the event on close
        FormClosed += (s, ee) => _dataObject.PropertyChanged -= DataObject_PropertyChanged;

        UpdateTitle();
    }

    // a method responsible for updating the gui.
    private void UpdateTitle() =>
        label1.Text = _dataObject.Title;

    private void DataObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case nameof(DataObject.Title):
                UpdateTitle();
                break;
        }
    }
}

public class DataObject : INotifyPropertyChanged
{
    private string _title;

    public string Title
    {
        get { return _title; }
        set
        {
            _title = value;
            // here the event is fired.
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
0 голосов
/ 17 апреля 2020

Например, если вы хотите взять текст label1 формы form1 из другой формы. Сначала создайте label1 publi c из файла former's Designer.cs. Затем: (Также это работает в методах stati c)

string label1text = Application.OpenForms.OfType<Form1>().Last()?.label1.Text;

Возможно, есть более эффективный способ, но это то, что я знаю. Извините за плохой английский sh кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...