如何解决一个新的消息框出现后每秒出现一次
我遇到了一个问题,我尝试在倒计时到达一定时间后尝试显示一个显示框,但是由于某种奇怪的原因,尽管它已经超过了它应该出现的初始时间,但它却每秒复制一次。这是我尝试执行的操作,但是现在计时器已停止并且剩余时间列已停止响起。
public partial class Form1 : Form
{
private List<CSession> sessionlist = new List<CSession>();
private TimeSpan workingTimeSpan = new TimeSpan();
private TimeSpan fiveMinutes = new TimeSpan(0,1,0);
private TimeSpan onesecond = new TimeSpan(0,1);
public Form1()
{
InitializeComponent();
timer1.Enabled = true;
timer1.Start();
}
private void label1_Click(object sender,EventArgs e)
{
}
private void AddTime_Click(object sender,EventArgs e)
{
workingTimeSpan += fiveMinutes;
displayWorkingTimeSpan();
}
private void displayWorkingTimeSpan()
{
TimerLabel.Text = workingTimeSpan.ToString();
}
private void DecreaseTime_Click(object sender,EventArgs e)
{
TimeSpan fiveMinutes = new TimeSpan(0,5,0);
workingTimeSpan -= fiveMinutes;
displayWorkingTimeSpan();
}
private void Confirm_Click(object sender,EventArgs e)
{
CSession newSession = new CSession();
if(PasswordText.Text == "")
{
MessageBox.Show("Password not entered");
return;
}
newSession.password = PasswordText.Text;
newSession.purchased_time = workingTimeSpan;
newSession.remaining_time = workingTimeSpan;
newSession.status = "Online";
sessionlist.Add(newSession);
PasswordText.Text = "";
TimerLabel.Text = "";
workingTimeSpan = new TimeSpan();
}
private void displayAllSessions()
{
listView1.Items.Clear();
foreach(CSession c in sessionlist)
{
string[] row = { c.password,c.purchased_time.ToString(),c.remaining_time.ToString(),c.status };
ListViewItem i = new ListViewItem(row);
listView1.Items.Add(i);
}
}
private void timer1_Tick(object sender,EventArgs e)
{
foreach(CSession c in sessionlist)
{
if (c.remaining_time.TotalMinutes == 5)
{
timer1.Stop();
MessageBox.Show("Time almost up for client.");
}
if (c.remaining_time.TotalSeconds < 1)
{
c.status = "Offline";
}
if(c.status == "Online")
{
c.remaining_time -= onesecond;
}
}
displayAllSessions();
}
private void exitToolStripMenuItem_Click(object sender,EventArgs e)
{
Close();
}
}
解决方法
添加一个在显示消息时会被切换的标志,因此不会再次显示它:
private bool MessageDisplayed = false;
private void timer1_Tick(object sender,EventArgs e)
{
foreach(CSession c in sessionlist)
{
if (c.remaining_time.TotalMinutes == 5 && !MessageDisplayed) // <-- check the flag
{
MessageDisplayed = true;
MessageBox.Show("Time almost up for client.");
}
if (c.remaining_time.TotalSeconds < 1)
{
c.status = "Offline";
}
if(c.status == "Online")
{
c.remaining_time -= oneSecond;
}
}
DisplayAllSessions();
}
现在,您可以使计时器保持运行状态,并且您的消息只会显示一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。