【问题标题】:Update a value on every form if changed in one如果在一个表单中更改,则更新每个表单上的值
【发布时间】:2020-04-16 21:34:06
【问题描述】:

我正在尝试将一个标签更改为多个表单。标签在一个表单上的更改期间更新,但它必须链接到其他表单的标签。这意味着如果表格 1 上的 label1 显示 10,而我转到表格 2,它也必须显示 10 label2。如果表格 2 上的标签更新为 11,然后我返回表格 1,它必须显示 11。我以前从未这样做过,也想不出任何编码来获得这个。有没有办法做到这一点?

表格 1

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

表格2

公共字符串LabelText { 得到 { 返回 this.totalChips.Text; } 放 { this.totalChips.Text = 价值; } }

【问题讨论】:

标签: c# windows winforms


【解决方案1】:

例如,如果你想从其他表单中获取 form1 的 label1 的文本。 首先从form1 的Designer.cs 中公开label1。 然后:(它也适用于静态方法)

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

可能有更有效的方法,但这就是我所知道的。 顺便说一句,抱歉英语不好。

【讨论】:

  • 您认为Last()?.label1.Text 包含label1 属性?
【解决方案2】:

我会将一个对象传递给构造函数。包含一些属性的对象,当设置属性时,它将向所有侦听器触发一个事件,然后它们可以更新他们的屏幕。这种方法的优点是,Form2 不依赖于 Form1(解耦)。只要调用者传递一个有效的 DataObject,Form2 仍然可以被 Form3 重用。

这是一个如何使用 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;
}

【讨论】:

  • 好吧,我设法使用简单的传递方法连接标签。但现在我想将标签中的文本转换为 int,以便稍后从中减去数字。我尝试了 convert.ToInt32() 并解析。我在页面加载中声明了 int 但不能在另一个类中使用它
  • 在我可以在顶部声明 int 但它被设置为 int x = 1000;现在我希望标签值显示为 int 值
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多