Member 12556743 Ответов: 1

Как начать мигать на отдельной записи при каждом ее нажатии


У меня есть таблица, которая состоит из нескольких строк записи.
Каждая запись имеет один индекс, где в соответствии с формулой триггера с таймером а будет выбран индекс. Каждый раз, когда этот индекс выбран, вся линия будет мигать в течение нескольких секунд с таймером B.

Например, когда триггер попадает в индекс "3", запись "3" будет мигать с таймером B. И в то же время, в пределах интервала, должен ли таймер триггера попадать в индекс "5", запись "5" также должна мигать.

Однако у меня есть проблема, чтобы сделать это. Когда по таймеру триггер попадет в другой индекс, предыдущая мигающая запись перестанет мигать и изменится на новую запись.

Как я могу поддерживать мигание в нескольких записях?

Функция запускается в & lt; checkstatusid>.

Что я уже пробовал:

private void checkstatusid(string statusid)
        {
            Int64 Status_id = Convert.ToInt64(statusid);
            if (displayquery.Contains(Status_id.ToString()))
            {
                switch (Status_id)
                {
                    case 1:
                        startCalling("1");
                        break;
                    case 2:
                        startCalling("2");
                        break;
                    case 3:
                        startCalling("3");
                        break;
                    default:
                        break;
                }
            }
        }

        private void startCalling(string statusid)
        {
            sound(statusid);
            blink();
        }

        private int blinktimercount = 0;

        private void blink()
        {
            Blinking.Enabled = true;
            Blinking.Start();
            currentblinking = Convert.ToInt16(dtqueue.Rows[i]["Runningnumber"]);
        }
        private void sound(string statusid)
        {
            Int64 Status_id = Convert.ToInt64(statusid);
            if (Status_id == 1)
            {
                try
                {
                    string ApplicationPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
                    string SoundPath = ApplicationPath + "\\Resources\\sound1.wav";
                    System.Media.SoundPlayer simpleSound = new System.Media.SoundPlayer(SoundPath);
                    simpleSound.Play();
                }
                catch (Exception ex)
                { }

            }
            if (Status_id == 2)
            {
                try
                {
                    string ApplicationPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
                    string SoundPath = ApplicationPath + "\\Resources\\sound2.wav";
                    System.Media.SoundPlayer simpleSound = new System.Media.SoundPlayer(SoundPath);
                    simpleSound.Play();
                }
                catch (Exception ex)
                { }
            }
            if (Status_id == 3)
            {
                try
                {
                    string ApplicationPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
                    string SoundPath = ApplicationPath + "\\Resources\\sound3.wav";
                    System.Media.SoundPlayer simpleSound = new System.Media.SoundPlayer(SoundPath);
                    simpleSound.Play();
                }
                catch (Exception ex)
                { }
            }
        }

        private void BlinkTimer_Tick(object sender, EventArgs e)
        {
            animateBlinking(currentblinking.ToString());
        }

        private void animateBlinking(string selected)
        {
            int listviewcounter = 0;
            for (listviewcounter = 0; listviewcounter < lvAppmt.Items.Count; listviewcounter++)
            {
                if (lvAppmt.Items[listviewcounter].SubItems[0].Text == selected)
                {
                    if (blinktimercount % 2 == 0)
                    {
                        lvAppmt.Items[listviewcounter].BackColor = Color.Lime;
                        lvAppmt.Items[listviewcounter].ForeColor = Color.Black;
                    }
                    else
                    {
                        lvAppmt.Items[listviewcounter].BackColor = Color.Black;
                        lvAppmt.Items[listviewcounter].ForeColor = Color.White;
                    }
                    blinktimercount = blinktimercount + 1;
                }
            }
            if (blinktimercount == 60)
            {
                Blinking.Stop();
                blinktimercount = 0;
                listviewcounter = 0;
                lvAppmt.Items[listviewcounter].BackColor = Color.Black;
                lvAppmt.Items[listviewcounter].ForeColor = Color.White;
            }
        }

1 Ответов

Рейтинг:
0

Andy Lanng

Быстрое решение:

private static List<Blinker> _blinkers { get; set; } //you should make this thread safe, just in case

private class Blinker{
  public int Id { get; set; }
  public int Counter {get; set;}
  public Blinker(int id){
    Id = id;
  }
}
private void StartBlinking(int id){
  if(!_blinkers.Any(b=>b.Id==id))
     _blinkers.Add(new Blinker(id));
}
private void StopBlinking(int id){
  if(_blinkers.Any(b=>b.Id==id)){
     _blinkers.Remove(_blinkers.Single(b=>b.Id==id));
  }
}
private void BlinkTimer_Tick(object sender, EventArgs e)
{
    animateBlinking();
}
private void animateBlinking()
{

  foreach(var blink in _blinkers)
  {
    int listviewcounter = 0;
    for (listviewcounter = 0; listviewcounter < lvAppmt.Items.Count; listviewcounter++)
    {
      if (lvAppmt.Items[listviewcounter].SubItems[0].Text == blink.Id.ToString)
      {
         if (blink.Counter % 2 == 0)
         {
            lvAppmt.Items[listviewcounter].BackColor = Color.Lime;
            lvAppmt.Items[listviewcounter].ForeColor = Color.Black;
         }
         else
         {
             lvAppmt.Items[listviewcounter].BackColor = Color.Black;
             lvAppmt.Items[listviewcounter].ForeColor = Color.White;
         }
         blink.Counter++; //(does the same as +1.  Also blink.Counter+=1 is shorthand for what you had)
      }
   }
   if (blink.Counter== 60)
   {
     _blinkers.Remove(blink)
     listviewcounter = 0;
     lvAppmt.Items[listviewcounter].BackColor = Color.Black;
     lvAppmt.Items[listviewcounter].ForeColor = Color.White;
   }
}



Как я уже сказал: быстрое исправление-есть много способов сделать то, что вам нужно, но это имеет мало изменений и является хорошим методом "огонь и забудь".
Запустите таймер. Никогда не останавливайся.

Чтобы получить мигающий новый элемент, позвоните по телефону StartBlinking(selected) Он остановится сам, когда его удалят из списка.

Надеюсь, это поможет ^_^
Энди