Как можно назначить конкретный таймер EventHandler для конкретного значения в C # - PullRequest
0 голосов
/ 12 октября 2011

У меня есть массив timer.Я хочу, чтобы timer0 работал с 1-м dataValue в _dataValues, 2-й таймер работал с 2-м dataValue в _dataValues, 3-й таймер работал с 3-м dataValue в _dataValues ​​и т. Д., А также отображал результат в метке в форме Windows. Я использую System.Windows.Forms.Timer. Вот мой код,

void PrepareTimers(List<int> _dataValues)    
{
    int i = 0;

    foreach (int dataValue in _dataValues)
    {
        timerNames[i] ="timer"+ string.Format("{0}", i);
        timer1[i] = new Timer();

        t[i] = dataValue.ToString();
        a[i] = timer1[i].ToString();
        a[i] = t[i];

        timer1[i].Tick += new EventHandler(timer_Tick);
        timer1[i].Interval = (1000) * (1);                   

        label = new Label();
        label.Name = "label_name" + i;
        label.Size = new Size(200, 20);
        label.Location = new Point(45, 100 + i * 30);
        label.TabIndex = i;
        label.Visible = true;
        this.Controls.Add(label);                    

        dict[timer1[i]] = label;
        timer1[i].Enabled = true;
        timer1[i].Start();
        i++;    
    }
}

private void timer_Tick =(object sender, EventArgs e)    
{       
    string myconstring = "SERVER=localhost;" + "DATABASE=alicosms;" + "UID=root;" + "PASSWORD=;";
    MySqlConnection mycon = new MySqlConnection(myconstring);

    i = 0;
    string u = "UPDATED";
    mycon.Open();

    foreach (int dataValue in _dataValues)               
    {                
        if (a[i] == dataValue.ToString())
        {
            MySqlCommand cmd = new MySqlCommand("UPDATE sms_data_bankasia set flag =  " + (dataValue.ToString()) + " *2 , sendingstatus = '" + u + "' WHERE flag = " + dataValue.ToString() + " LIMIT 1", mycon);

            cmd.ExecuteNonQuery();
            Console.WriteLine("row update" + dataValue.ToString());          

            mycon.Close();

            mycon.Open();
            string sql = "SELECT count(flag) FROM sms_data_bankasia where sendingstatus='UPDATED' AND flag = " + (dataValue.ToString()) + " *2 group by flag";
            MySqlCommand comd = mycon.CreateCommand();
            comd.CommandText = sql;
            MySqlDataReader dtr = comd.ExecuteReader();
            try
            {
                while (dtr.Read())
                {
                    Timer t = (Timer)sender;
                    dict[t].Text = dtr[0].ToString() + " program Updated " + dataValue.ToString();                                
                }
                dtr.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        i++;
    }
    mycon.Close();
}

Но он обновляет 4 строки в секунду, и каждый EventHandler работает с каждым dataValue. Я хочу, чтобы 1-й таймер обновлял 1 строку в 1 с и показывал в метке, что 1-я строка обновляется с 1-м dataValue, а 2-й таймер обновляется 1-й через 1 секунду и показывается в другой ярлык, который обновляет 1 строку со вторым dataValue и т. д. Что мне делать? Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 12 октября 2011

В PrepareTimers назначить тег каждому таймеру: timer1[i] = new Timer(); timer1[i].Tag = i; Затем вы можете использовать это в timer_Tick вместо циклического перемещения по всему массиву:

i = (int)((Timer)sender).Tag;
int dataValue = _dataValues[i];
//...

вместо:

i = 0;
foreach (int dataValue in _dataValues)
{
    if (a[i] == dataValue.ToString())
    //...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...