簡體   English   中英

如何按 C# 中的時間啟用和禁用時間

[英]How Can I Enable and Disable Time by The time in C#

在我的 Windows forms 中,我想按時間示例禁用和啟用按鈕:下午 4:00 按鈕將被禁用。

這是我的代碼:

labelTime.Text = DateTime.Now.ToShortTimeString(); // this will be the time

timer1.Start();

switch (DateTime.Now.ToShortTimeString())
{
    case "4:51 AM":
        OutBtn.Enabled = true;
        break;

    default:
        OutBtn.Enabled = false;
        break;
}

這是您可以做到的一種方法:

// In constructor of form.
Timer timer = new Timer();
timer.Tick += timer_Tick;

DateTime now = DateTime.Now;
DateTime disableTime = new DateTime(now.Year, now.Month, now.Day, 4, 51, 0);

if(disableTime > now)
   timer.Interval = (int)(disableTime - now).TotalMilliseconds;
timer.Start();

Timer_Tick是這樣的:

private void timer_Tick(object sender, EventArgs e)
{
    yourButton.Enabled = false;
    (sender as Timer).Stop();
}

更新

正如 Brett Caswell 在下面的評論中提到的,上面的代碼不會“啟用和禁用”按鈕。

下面是一個根據指定的enableTimedisableTime啟用/禁用按鈕的示例(我正在禁用/啟用BtnExit )。

DateTime enableTime = new DateTime(1, 1, 1, 4, 51, 0);
DateTime disableTime = new DateTime(1, 1, 1, 16, 0, 0);

public FrmMain()
{
    InitializeComponent();

    Timer timer = new Timer();

    DateTime now = DateTime.Now;
    
    bool isNowEnableTime = enableTime.TimeOfDay < now.TimeOfDay && now.TimeOfDay < disableTime.TimeOfDay;

    if (isNowEnableTime)
    {
        setIntervalForNextDisableTime(timer);
        timer.Tick += disableButton;
    }
    else
    {
        setIntervalForNextEnableTime(timer);
        timer.Tick += enableButton;
    }

    timer.Start();
}

private void disableButton(object sender, EventArgs e)
{
    BtnExit.Enabled = false;
    
    var timer = sender as Timer;

    timer.Stop();
    timer.Tick -= disableButton;

    timer.Tick += enableButton;
    setIntervalForNextEnableTime(timer);

    timer.Start();
}

private void enableButton(object sender, EventArgs e)
{
    BtnExit.Enabled = true;

    var timer = sender as Timer;

    timer.Stop();
    timer.Tick -= enableButton;

    timer.Tick += disableButton;
    setIntervalForNextDisableTime(timer);

    timer.Start();
}

private void setIntervalForNextDisableTime(Timer timer) =>
    timer.Interval = (int)(getNextOccurranceOfTime(disableTime) - DateTime.Now).TotalMilliseconds;

private void setIntervalForNextEnableTime(Timer timer) =>
    timer.Interval = (int)(getNextOccurranceOfTime(enableTime) - DateTime.Now).TotalMilliseconds;

/// <summary>
/// Get the next occurrance of <paramref name="dateTime"/> relative to now.
/// </summary>
private DateTime getNextOccurranceOfTime(DateTime dateTime) => getNextOccurranceOfTime(dateTime, DateTime.Now);
private DateTime getNextOccurranceOfTime(DateTime dateTime, DateTime relativeTo)
{
    if(relativeTo.TimeOfDay > dateTime.TimeOfDay) /// dateTime was in past. Next occurrance is going to be tommorrow.
    {
        var tomorrow = relativeTo.AddDays(1);
        return new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, dateTime.Hour, dateTime.Minute, dateTime.Second);
    }

    /// dateTime hasn't come yet, it's going to be today.
    return new DateTime(relativeTo.Year, relativeTo.Month, relativeTo.Day, dateTime.Hour, dateTime.Minute, dateTime.Second);
}

暫無
暫無

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

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