微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个新的消息框出现后每秒出现一次

如何解决一个新的消息框出现后每秒出现一次

我遇到了一个问题,我尝试在倒计时到达一定时间后尝试显示一个显示框,但是由于某种奇怪的原因,尽管它已经超过了它应该出现的初始时间,但它却每秒复制一次。这是我尝试执行的操作,但是现在计时器已停止并且剩余时间列已停止响起。

 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 举报,一经查实,本站将立刻删除。