更改时自动更新全局变量中的标签

时间:2011-04-22 09:18:03

标签: 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(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);
        }
    }
}

现在......每当我们按下两个按钮之一并将值保存到全局变量计数然后将其显示在label1中时,我有一个程序可以将数字加1或减1。

假设我想更改另一个标签(label2)的值,我想在每次标签1更改时显示计数变量值的内容。

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

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的值而不是来自按钮的事件,但不知何故,它会在计数变量发生变化时自动更新值。

请帮忙。

3 个答案:

答案 0 :(得分:7)

在这种情况下使用属性

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;

答案 1 :(得分:4)

您无法对static成员进行数据绑定,也无法将数据绑定到字段(除非您使用自定义绑定模型);一个选项是拥有一些可以进行数据绑定的上下文实例,例如:

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);
            }
        }
    }
}

然后可以将Counters实例传递给表单,并将数据绑定:

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

你当然可以拥有static的{​​{1}}个实例,但又一次:这不是一个很棒的设计; Counters通常意味着你采取了一个hacky捷径。

答案 2 :(得分:1)

使用房产怎么样?它不再是静态的,这是一个要求吗?

[编辑:如果需要,你可以再次使_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);
        }
    }
}

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