2017-05-02 4 views
0

Je suis nouveau sur C#. J'essaie de créer un simple programme de rappel de tâches. Le problème est que lorsque j'essaie d'ajouter un compte à rebours pour l'heure limite, cela ne fonctionnera pas correctement.Compte à rebours multiple dans listview C# duplication

Mon premier compte à rebours de la tâche sera écrasé par mon deuxième compte à rebours de la tâche, le même cas lorsque j'ajoute la troisième tâche et ainsi de suite.

Voici le code de la partie corrélative.

 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'"); 
      } 
     } 

    } 

Ce serait très apprécié pour tous ceux qui veulent aider. Merci d'avance.

Here is the link to the picture of my problem

Répondre

0

Ce que vous faites est maintenant sur chaque bouton cliquez surchargée l'objet endTime actuel par un nouveau comme:

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

Si vous attribuez un nouvel objet DateTime-endTime. Vous remplacez l'ancien. Ainsi, le premier clic sur le bouton fonctionnera, mais le second créera un nouvel objet de DateTime et lui affectera to endTime. Ensuite, vous calculez la différence de temps sur ce un objet DateTime. Il est donc logique que ce sera en même temps pour chaque élément listview

Si vous voulez avoir plus d'un DateTime utiliser une liste pour le stocker dans comme

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

Dans la méthode de clic bouton ajouter la DateTime à la liste

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

Ensuite, vous pouvez faire une boucle à travers les dates et calculer pour chacun la différence de temps dans la méthode tique:

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

Vous créez également une minuterie pour chaque heure à calculer après 500 ms. Vous pouvez maintenant utiliser une minuterie, c'est plus efficace que d'en faire un pour chaque fois. Il suffit de céder ce qui a dit: « Le nom « dateTime » dans le constructeur

public Form1() 
    { 
     InitializeComponent(); 

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

Code entier

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'"); 
       } 
      } 
     } 
    } 
} 
+0

Merci pour la réponse, mais quand je l'ai essayé ce code, il en résulte une erreur n'existe pas dans la contexte actuel "dans void t_Tick. –

+0

L'erreur est-elle levée dans la boucle foreach OU lorsque vous utilisez dateTime. Soustrayez ... –

+0

Si j'essaie le code, aucune erreur ne sera générée. Pourriez-vous décrire où l'erreur se produit? –