Как связать 2 ярлыка в 2 разных формах - PullRequest
0 голосов
/ 18 февраля 2019

У меня в таймере работает таймер с меткой «timenumber», показывающей время, у меня также есть вторая форма с меткой «таймер».Как связать их так, чтобы они оба имели одинаковое значение в одно и то же время?Форма 1 используется в качестве контроллера, а форма 2 - это та, которая отображается на другом мониторе.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Опция 1
Передайте ссылку на метку обратного отсчета в Form1 на Form2, используя ее конструктор, затем используйте эту ссылку, чтобы подписаться на событие TextChanged метки:

In Form1:

private int CountDown = 100;

private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2(this.[The Counter Label]);
    form2.Show();
    this.timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.[The Counter Label].Text = CountDown.ToString();
    if (CountDown == 0)
        this.timer1.Enabled = false;
    CountDown -= 1;
}

In Form2:

public form2() : this(null) { }

public form2(Control timerCtl)
{
    InitializeComponent();
    if (timerCtl != null) {
        timerCtl.TextChanged += (s, evt) => { this.[Some Label].Text = timerCtl.Text; };
    }
}

Вариант 2
Используйте открытое свойство Form2, для которого можно установить ссылку на элемент управления.Установите это свойство в Form1 сразу после создания нового экземпляра Form2.
Однако это означает, что Form1 необходимо знать об этом свойстве в Form2:

В Form1:

private int CountDown = 100;

private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
    form2.CountDownControl = this.[The Counter Label];
    this.timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.[The Counter Label].Text = CountDown.ToString();
    if (CountDown == 0)
        this.timer1.Enabled = false;
    CountDown -= 1;
}

В Form2:

private Control timerCtl = null;

public Control CountDownControl {
    set { this.timerCtl = value;
        if (value != null) {
            this.timerCtl.TextChanged += (s, evt) => { this.[Some Label].Text = timerCtl.Text; };
        }
    }
}

Существует множество других опций.

Вы также можете использовать Публичное свойство в Form2 и установить это свойство непосредственно из события Timer.Tick.Открытое свойство, как и во втором примере, может установить для свойства Text одного из его элементов управления значение свойства.
Мне не очень нравится этот параметр, тем не менее, он доступен.

В Form1:

private int CountDown = 100;

private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
    this.timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.[The Counter Label].Text = CountDown.ToString();
    form2?.CountDownValue = CountDown;
    if (CountDown == 0)
        this.timer1.Enabled = false;
    CountDown -= 1;
}

В Form2:

public int CountDownValue {
    set { this.[Some Label].Text = value.ToString(); }
    }
}

Вы также можете иметьпользовательское событие в Form1, которое Form2 может подписать или реализовать INotifyPropertyChange.Но это то же самое, что и вариант1.

0 голосов
/ 18 февраля 2019

Если form1 открывает form2, это легко.В Form2 определите свойство для установки текста на метке:

public string TimerText 
{
  set => _timerLabel.Text = value;
}

Вам также может понадобиться вызвать _timerLabel.Invalidate();, чтобы принудительно обновить метку.

Затем, когдатаймер обратного отсчета в form1 обновляется, просто установите это свойство в form2:

private void Timer_Tick(object sender, EventArgs e)
{
  // calculate remaining time
  _form2.TimerText = remainingTime.ToString();
}

Здесь _form2 является ссылкой на объект Form2, который показывает form1.

Вы можете иметь свойство в Form2 быть int или double, а не string;то, что вы выберете, может зависеть от того, делаете ли вы что-либо еще со значением в Form2.

...