Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改时自动从全局变量更新标签_C#_Winforms_Events_Label_Auto Update - Fatal编程技术网

C# 更改时自动从全局变量更新标签

C# 更改时自动从全局变量更新标签,c#,winforms,events,label,auto-update,C#,Winforms,Events,Label,Auto Update,这是我的节目 using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { static int count = 0; public Form1(){InitializeComponent();} private void button1_Click(objec

这是我的节目

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        static int count = 0;

        public Form1(){InitializeComponent();}

        private void button1_Click(object sender, EventArgs e)
        {
            count += 1;
            label1.Text = Convert.ToString(count);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            count -= 1;
            label1.Text = Convert.ToString(count);
        }
    }
}
现在。。。我有一个程序,每当我们按下两个按钮中的一个,将数值加上或减去1,并将数值保存到全局变量计数,然后在label1中显示

假设我想更改另一个标签(label2)的值,在这个标签中,我还想在每次label1更改时显示count变量value的内容

所以有一种方法,使用按钮中的事件,可以这样做:

private void button1_Click(object sender, EventArgs e)
{
    count += 1;
    label1.Text = Convert.ToString(count);
    label2.Text = Convert.ToString(count);
}

private void button2_Click(object sender, EventArgs e)
{
    count -= 1;
    label1.Text = Convert.ToString(count);
    label2.Text = Convert.ToString(count);
}
所以问题是

但假设我想更新label2的值,而不是从按钮事件,而是在某种程度上,它会自动更新count变量中的值,只要它发生变化


请提供帮助。

在这种情况下使用属性

private int count
private int Count
{
    get { return count; }
    set 
    { 
       count = value;
       RefreshLabels();
    }
}

private void RefreshLabels()
{
    label1.Text = Convert.ToString(count);
    label2.Text = Convert.ToString(count);
}
当您想要更改计数时,只需使用属性即可

Count += 1;
Count -= 1;

不能将数据绑定到
静态成员,也不能将数据绑定到字段(除非使用自定义绑定模型);一种选择是使用一些您也可以绑定数据的上下文实例,例如:

public class Counters {
    public event EventHandler SomeNameChanged;
    private int someName;
    public int SomeName {
        get { return someName; }
        set {
            if(someName != value) {
                someName = value;
                var handler = SomeNameChanged;
                if(handler != null) handler(this, EventArgs.Empty);
            }
        }
    }
}
然后可以将
计数器
实例传递到表单,并进行数据绑定:

private void BindCounters(Counters counters)
{
    label1.DataBindings.Add("Text", counters, "SomeName");
    label2.DataBindings.Add("Text", counters, "SomeName");
}

当然,您可以有一个
计数器的
静态
实例,但同样:这不是一个好的设计<代码>静态
通常意味着你走的是一条很短的捷径。

如何使用属性?它不能再是静态的了,这是一个要求吗

[编辑:如果需要,您可以再次将_count设置为静态。]

private EventHandler CountChanged;

private int _count;
private int count
{
    get
    {
        return _count;
    }
    set
    {
        if(_count != value)
        {
            _count = value;
            if(CountChanged != null)
                CountChanged(this, EventArgs.Empty);
        }
    }
}

每当修改
count
时,这将始终触发事件
CountChanged
,因此您可以为每个控件附加自定义事件处理程序。

如果变量在program.cs文件中而不是form.cs中,该怎么办?这会有什么不同吗?如果您从表单类中引用了该变量,那么它将起作用