首页 > 解决方案 > 如果不满足特定时间范围,如何启用或禁用组合框中的值

问题描述

您好,我有一个程序,其中包含一系列组合框,用户可以从中选择不同的值。其中一个 cb 中包含 1、2 和 3 int 值。这些值分别对应于第一、第二和第三班次。如果系统时间从早上 6 点开始,我想禁用值 2 和 3。直到下午 2 点。然后对其他班次做同样的事情。如果系统时间是从下午 2 点到晚上 10 点,则禁用或灰显数字 1 和 3。如果系统时间从晚上 10 点开始,则禁用 CB 值 1 和 2。到早上 6 点。我目前正在使用计时器在 UI 上的标签内显示系统时间。我不知道从哪里开始。我查看了谷歌和那里的所有答案,与 WPF 或 Javascript 相关,而不是 Winforms。在 WinForms c# 中甚至可以使用此功能吗?

谢谢你。

标签: c#winforms

解决方案


注意:这个答案大量借鉴了Apurba Ranjan撰写的这篇文章


您可以做的一件“hacky”事情是为您的组合框项目创建一个自定义类,其中包含一个Enabled属性:

class ComboBoxItem
{
    public string Text { get; set; }
    public bool Enabled { get; set; }

    public ComboBoxItem(string text, bool enabled)
    {
        Text = text;
        Enabled = enabled;
    }
}

然后,当我们将此类的项目添加到组合框时,我们Enabled根据当前时间设置属性(注意我们还为事件设置DisplayMember并挂钩了事件处理程序SelectedIndexChanged):

private void Form1_Load(object sender, EventArgs e)
{
    cboShifts.DisplayMember = "Text";
    cboShifts.SelectedIndexChanged += CboShifts_SelectedIndexChanged;

    var currentTime = DateTime.Now;

    var firstEnabled = currentTime >= DateTime.Parse("6:00 AM") && 
                       currentTime < DateTime.Parse("2:00 PM");

    var secondEnabled = currentTime >= DateTime.Parse("2:00 PM") && 
                        currentTime < DateTime.Parse("10:00 PM");

    var thirdEnabled = !firstEnabled && !secondEnabled;

    cboShifts.Items.Add(new ComboBoxItem("1", firstEnabled));
    cboShifts.Items.Add(new ComboBoxItem("2", secondEnabled));
    cboShifts.Items.Add(new ComboBoxItem("3", thirdEnabled));
}

然后,在这种情况SelectedIndexChanged下,我们可以获得选中的项目,如果它是null(意味着选中的索引是-1)然后我们返回,否则如果它的Enabled属性是false,我们将选中的索引设置为-1(基本上不允许他们选择它):

private void CboShifts_SelectedIndexChanged(object sender, EventArgs e)
{
    var item = (sender as ComboBox)?.SelectedItem as ComboBoxItem;
    if (item == null) return;

    // Don't let the user select a disabled item
    if (!item.Enabled)
    {
        cboShifts.SelectedIndex = -1;
        MessageBox.Show($"Item '{item.Text}' is not enabled");
        return;
    }

    // Optionally do something here for a valid selection
}

推荐阅读