簡體   English   中英

ListView C#復制中的多個倒數計時器

[英]Multiple countdown timer in listview C# duplicating

我是C#的新手。 我正在嘗試制作一個簡單的任務提醒程序。 問題是,當我嘗試為截止時間添加倒數計時時,它將無法正常工作。

我的第一個任務倒計時將被我的第二個任務倒計時覆蓋,添加第三個任務時的情況相同,依此類推。

這是相關部分的代碼。

        private void buttonSave_Click(object sender, EventArgs e)
    {
        if (this.textBox_Task.Text != "")
        {
            listView1.View = View.Details;
            ListViewItem lvwItem = listView1.Items.Add(dateTimePicker1.Text);
            var day = dateTimePicker1.Value.Day;
            var month = dateTimePicker1.Value.Month;
            var year = dateTimePicker1.Value.Year;

            endTime = new DateTime(year,month,day);

            //Console.WriteLine(day);
            //Console.WriteLine(month);
            //Console.WriteLine(year);
            //Console.WriteLine(dTime

            Timer t = new Timer();
            t.Interval = 500;
            t.Tick += new EventHandler(t_Tick);
            t.Start();

            lvwItem.SubItems.Add(textBox_Task.Text);
            lvwItem.SubItems.Add(textBox_Note.Text);
            lvwItem.SubItems.Add("");
            this.dateTimePicker1.Focus();
            this.textBox_Note.Focus();
            this.textBox_Task.Focus();
            this.textBox_Task.Clear();
            this.textBox_Note.Clear();

        }
        else
        {
            MessageBox.Show("Please enter a task to add.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.textBox_Task.Clear();
            this.textBox_Note.Clear();
        }
    }

        void t_Tick(object sender, EventArgs e)
    {
        TimeSpan ts = endTime.Subtract(DateTime.Now);
        var hari = dateTimePicker1.Value.Day;
        Console.WriteLine(ts.Days);

        for (int i = 0; i < listView1.Items.Count; i++)
        {
            if (ts.Days == 0)
            {
                listView1.Items[i].SubItems[3].Text = "DEADLINE";
            }
            else
            {
                listView1.Items[i].SubItems[3].Text = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds to go'");
            }
        }

    }

對於願意幫助的人將不勝感激。 提前致謝。

這是我的問題圖片的鏈接

您現在要做的是在每個按鈕上單擊一次,用新的方法覆蓋當前endTime對象,例如:

endTime = new DateTime(year,month,day); 

如果將新的DateTime對象分配給endTime 您覆蓋舊的。 因此,第一個按鈕單擊將起作用,但第二個按鈕將創建DateTime的新對象並將其分配to endTime 接下來,您要計算上一個對象的時間差DateTime 因此,邏輯上來說,每個listview項都應該是同一時間

如果您想擁有多個DateTime使用List將其存儲在

    List<DateTime> _times = new List<DateTime>();

在按鈕的單擊方法中,將DateTime添加到列表中

  // here add the datetime to the list
  DateTime dateTime = new DateTime(year, month, day);
   _times.Add(dateTime);

接下來,您可以遍歷日期,並在tick方法中為每個日期計算時間差:

        foreach (var dateTime in _times)
        {
            TimeSpan ts = dateTime.Subtract(DateTime.Now);
            // etc..
        }

此外,您還將為每次創建一個計時器,以在500 ms之后進行計算。 現在,您可以使用一個計時器,這比每次創建一個計時器更為有效。 只需在構造函數中分配它

  public Form1()
  {
        InitializeComponent();

        Timer t = new Timer();
        t.Interval = 500;
        t.Tick += new EventHandler(t_Tick);
        t.Start();
   }

整個代碼

public partial class Form1 : Form
{
    // This is the list where  the DateTimes are stored so you can have more values
    List<DateTime> _times = new List<DateTime>();
    public Form1()
    {
        InitializeComponent();

        // Assign the timer here
        Timer t = new Timer();
        t.Interval = 500;
        t.Tick += new EventHandler(t_Tick);
        t.Start();
    }

    private void buttonSave_Click(object sender, EventArgs e)
    {
        if (this.textBox_Task.Text != "")
        {
            listView1.View = View.Details;
            ListViewItem lvwItem = listView1.Items.Add(dateTimePicker1.Text);
            var day = dateTimePicker1.Value.Day;
            var month = dateTimePicker1.Value.Month;
            var year = dateTimePicker1.Value.Year;

            // Add Datetime to list
            DateTime dateTime = new DateTime(year, month, day);
            _times.Add(dateTime);

            lvwItem.SubItems.Add(textBox_Task.Text);
            lvwItem.SubItems.Add(textBox_Note.Text);
            lvwItem.SubItems.Add("");
            this.dateTimePicker1.Focus();
            this.textBox_Note.Focus();
            this.textBox_Task.Focus();
            this.textBox_Task.Clear();
            this.textBox_Note.Clear();

        }
        else
        {
            MessageBox.Show("Please enter a task to add.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.textBox_Task.Clear();
            this.textBox_Note.Clear();
        }
    }
    void t_Tick(object sender, EventArgs e)
    {
        // loop thru all datetimes and calculate the diffrence
        foreach (var dateTime in _times)
        {
            // Call the specific date and subtract on it
            TimeSpan ts = dateTime.Subtract(DateTime.Now);

            var hari = dateTimePicker1.Value.Day;
            Console.WriteLine(ts.Days);

            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (ts.Days == 0)
                {
                    listView1.Items[i].SubItems[3].Text = "DEADLINE";
                }
                else
                {
                    listView1.Items[i].SubItems[3].Text = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds to go'");
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM