Автоматически обновлять метку из глобальных переменных при изменениях - PullRequest
5 голосов
/ 22 апреля 2011

Итак, вот моя программа.

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), в которой я также хочу отображать содержимое значения переменной count каждый раз, когда изменяется label1.

Такесть один способ, использовать событие от кнопки, которое можно сделать так:

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 при каждом изменении.

Пожалуйста, помогите.

Ответы [ 3 ]

7 голосов
/ 22 апреля 2011

Используйте свойство для этой ситуации

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;
4 голосов
/ 22 апреля 2011

Вы не можете привязать данные к элементу 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 экземпляр Counters, но опять же: это не очень хороший дизайн; static часто означает, что вы используете хакерский короткий путь.

1 голос
/ 22 апреля 2011

Как насчет использования недвижимости? Это больше не может быть статичным, это требование?

[Редактировать: Вы можете снова сделать _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 изменяется, поэтому вы можете прикрепить свои собственные обработчики событий для каждого элемента управления.

...