#c#
#c#
Вопрос:
Я пытаюсь запрограммировать программу, которая открывает форму при нажатии кнопки. В этой форме есть метка с обратным отсчетом. В основной форме есть кнопка, которая выполняет следующие действия:
private void btnOpen_Click(object sender, EventArgs e)
{
List<string> ips = new List<string>();
if (pcTreeView.SelectedNodes.Count > 1)
{
foreach (RadTreeNode node in machinesTreeView.SelectedNodes)
{
foreach (XmlNode client in xdoc.SelectNodes("/clients/client"))
{
if (node.Text == client["clientShortName"].InnerText)
{
string ipAddress = client["clientIP"].InnerText;
ips.Add(client["clientIP"].InnerText);
clientNodeList.Add(node);
}
}
}
MsgBox msgbox = new MsgBox();
msgbox.ipAddressCollection = ips;
msgbox.Tag = "test";
msgbox.ShowDialog();
}
}
Затем открывается вторая форма. Код для моего обратного отсчета следующий:
int timeLeft = 45;
public List<string> ipAddressCollection { get; set; }
private void MsgBox_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private async void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
foreach (string ipAddress in ipAddressCollection)
{
if (this.Tag.ToString() == "test")
{
if (rebootShutdownTime > 0)
{
timeLeft = timeLeft - 1;
infoLabel.Text = "Countdown: " timeLeft.ToString();
timer1.Enabled = true;
}
}
}
}
Проблема в том,: Обратный отсчет отсчитывается за 2 шага (например 20 — 18 — 16 и т.д. вместо 20 — 19 — 18 — 17 и т.д.). В режиме отладки он считается правильным.
Есть предложения?
Комментарии:
1. Что, если обновлять метку после каждого тика?
infoLabel.Refresh();
2. Вероятно, в «release» у вас есть 2 соединения, поэтому он дважды вычитается из TimeLeft. Возможно, вам следует переместить оператор
timeLeft = timeLeft - 1
outside thefor
.3. foreach выполняется дважды. Проверьте это путем отладки.
4. Ах, потому что у меня есть два элемента в списке. Если бы у меня было 3 элемента, он отсчитал бы 3. Спасибо 🙂
5. Это приложение Winforms или Webforms?
Ответ №1:
Раздел кода под следующей строкой пахнет:
foreach (string ipAddress in ipAddressCollection)
Вы просто уменьшаете значение timeLeft
для каждого ipAddress
. Так что, если у вас 45 строк в ipAddressCollection
TimeLeft, они будут равны нулю даже при первом тике.