C# 如何创建高级倒计时计时器

C# 如何创建高级倒计时计时器,c#,winforms,variables,timer,countdown,C#,Winforms,Variables,Timer,Countdown,这个问题和这个有关,所以你们可以更好地理解它 我的答复是: txtAtiv.Text = dataGridView1.Rows[0].Cells[1].Value + ""; string value = dataGridView1.Rows[0].Cells[2].Value + ""; lblLeft.Text = value.Split(' ')[1]; textStatus.Text = ""; DateTime timeConvert; DateTime.TryParse(v

这个问题和这个有关,所以你们可以更好地理解它

我的答复是:

txtAtiv.Text = dataGridView1.Rows[0].Cells[1].Value + "";

string value = dataGridView1.Rows[0].Cells[2].Value + "";
lblLeft.Text = value.Split(' ')[1];
textStatus.Text = "";

DateTime timeConvert;
DateTime.TryParse(value, out timeConvert);

double time;
time = timeConvert.TimeOfDay.TotalMilliseconds;

var timeSpan = TimeSpan.FromMilliseconds(time);

lblSoma.Text = timeSpan.ToString();
timer2.Start();
根据我在那里写的答案,我想知道是否有一种方法可以将其应用于计时器,并将数据网格值(转换)转换为计时器值。所以如果我按下按钮,他们开始倒计时

我已尝试在计时器中插入以下代码:

private void timer2_Tick(object sender, EventArgs e)
{
    string timeOp = dataGridView1.Rows[0].Cells[2].Value + "";
    DateTime timeConvert;
    DateTime dateTime = DateTime.Now;
    DateTime.TryParse(timeOp, out timeConvert);

    double time;
    time = timeConvert.TimeOfDay.TotalMilliseconds;
    var timeSpan = TimeSpan.FromMilliseconds(time);

    if (time > 0)
    {
        time = time - 1000; //(millisec)
        lblCountdown.text = time.ToString();
    }
}

如果没有倒计时或其他什么,是否有人知道我应该做什么或为什么它不起作用?

时间的价值永远不会改变,因为你每次都会重新创建它

要解决这个问题,您必须在
勾选
事件之外声明递减的变量

将这两个变量放在表单上:

private int milliSecondsLeft = 0;
private bool timeSet = false;
然后将“勾号”事件更改为:

private void timer2_Tick(object sender, EventArgs e)
{
    if (!timeSet) // only get the value once
    {
        string dateTimeFromGrid = "4/29/2016 5:00:00 AM"; //hardcoded for simplicity, get the string from your grid
        DateTime fromGrid;
        DateTime.TryParse(dateTimeFromGrid, out fromGrid);
        milliSecondsLeft = (int)fromGrid.TimeOfDay.TotalMilliseconds;  
        timeSet = true;
    }

    milliSecondsLeft = milliSecondsLeft - 100; // timer's default Interval is 100 milliseconds

    if (milliSecondsLeft > 0)
    {
        var span = new TimeSpan(0, 0, 0, 0, milliSecondsLeft);
        lblCountdown.Text = span.ToString(@"hh\:mm\:ss");
    }
    else
    {
        timer2.Stop();
    }
}

确保时间的值永远不会更改,因为您每次都会重新创建它

要解决这个问题,您必须在
勾选
事件之外声明递减的变量

将这两个变量放在表单上:

private int milliSecondsLeft = 0;
private bool timeSet = false;
然后将“勾号”事件更改为:

private void timer2_Tick(object sender, EventArgs e)
{
    if (!timeSet) // only get the value once
    {
        string dateTimeFromGrid = "4/29/2016 5:00:00 AM"; //hardcoded for simplicity, get the string from your grid
        DateTime fromGrid;
        DateTime.TryParse(dateTimeFromGrid, out fromGrid);
        milliSecondsLeft = (int)fromGrid.TimeOfDay.TotalMilliseconds;  
        timeSet = true;
    }

    milliSecondsLeft = milliSecondsLeft - 100; // timer's default Interval is 100 milliseconds

    if (milliSecondsLeft > 0)
    {
        var span = new TimeSpan(0, 0, 0, 0, milliSecondsLeft);
        lblCountdown.Text = span.ToString(@"hh\:mm\:ss");
    }
    else
    {
        timer2.Stop();
    }
}

确保

您能显示启动计时器的代码吗?我按下按钮时会出现这种情况。忘了把这个放在上面,但还是什么也没发生。你还能给我看看吗?你应该仍然可以编辑你的问题。timer2\u勾选或者你是指某个timer2\u开始?@BobC我想你指的是这个
timer2\u开始()
?你能显示你启动计时器的代码吗?当我按下按钮时会发生这种情况。忘了把这个放在上面,但还是什么也没发生。你还能给我看看吗?你应该仍然可以编辑你的问题。timer2\u勾选或者你是指某个timer2\u开始?@BobC我想你的意思是
timer2\u开始()
?我会检查一下并给你反馈。很高兴听到这个消息。请花些时间来理解它为什么会起作用,以后它会帮你省去头疼。我会检查一下并给你反馈。很高兴听到。请花点时间来理解它为什么会起作用,它会在以后帮你省去头疼。