You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现移除ComboBox中两个时间点之间的所有选项——日历应用时间冲突规避需求

解决方案:移除忙碌时间段内的所有时间选项

没问题,咱们来搞定这个需求——要把忙碌时间段内的所有时间选项都从ComboBox里移除,核心是要把每个时间点和数据库里的忙碌区间做比对,而不是只删起止点。下面是具体的实现思路和代码示例:

关键思路

  • 先把ComboBox的所有时间选项转换成DateTime类型,方便后续区间比对
  • 从数据库读取目标用户的所有忙碌时间段(一定要用参数化查询避免SQL注入)
  • 筛选出不在任何忙碌区间内的时间点
  • 用筛选后的可用时间更新ComboBox

完整代码实现

1. 定义忙碌时间段实体类

先创建一个简单的类来存储从数据库读取的忙碌起止时间:

public class BusyInterval
{
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

2. 主逻辑代码

替换你原来的代码,用下面的逻辑实现完整的区间移除功能:

try
{
    // 第一步:将ComboBox中的所有时间选项转换为DateTime集合(确保格式和你的原有选项一致)
    var allTimeOptions = AssignTypeComboBox.Items.Cast<string>()
        .Select(timeStr => DateTime.Parse(timeStr)) // 如果是固定格式,建议用DateTime.ParseExact更稳妥
        .ToList();

    // 第二步:从数据库读取该用户的所有忙碌时间段(使用参数化查询防止SQL注入)
    var busyIntervals = new List<BusyInterval>();
    using (SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString))
    {
        string query = @"SELECT StartTime, EndTime 
                         FROM Events 
                         WHERE AssignType = @AssignType 
                         AND AssignTypeID = @AssignTypeID";
        
        SqlCommand cmd = new SqlCommand(query, con);
        cmd.Parameters.AddWithValue("@AssignType", "Employee");
        cmd.Parameters.AddWithValue("@AssignTypeID", EmployeeID);
        
        con.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                busyIntervals.Add(new BusyInterval
                {
                    StartTime = Convert.ToDateTime(rdr["StartTime"]),
                    EndTime = Convert.ToDateTime(rdr["EndTime"])
                });
            }
        }
    }

    // 第三步:筛选出不在任何忙碌区间内的可用时间
    var availableTimes = allTimeOptions.Where(time => 
        !busyIntervals.Any(interval => time >= interval.StartTime && time <= interval.EndTime))
        .ToList();

    // 第四步:更新ComboBox,只保留可用时间
    AssignTypeComboBox.Items.Clear();
    foreach (var time in availableTimes)
    {
        // 这里的格式要和你ComboBox原有时间的格式完全一致,比如"hh:mm tt"对应"03:00 AM"
        AssignTypeComboBox.Items.Add(time.ToString("hh:mm tt"));
    }
}
catch (Exception ex)
{
    // 可以添加错误提示或日志记录,比如MessageBox.Show($"加载可用时间失败:{ex.Message}");
}

注意事项

  • 时间格式一致性:如果你的ComboBox时间是固定格式(比如"HH:mm"或"hh:mm tt"),建议用DateTime.ParseExact代替DateTime.Parse,避免解析错误。例如:DateTime.ParseExact(timeStr, "hh:mm tt", CultureInfo.InvariantCulture)
  • 边界调整:代码中用time >= interval.StartTime && time <= interval.EndTime包含了起止时间,如果你想排除结束时间(比如6:30am的选项保留,因为日程到6:30结束),可以改成time < interval.EndTime
  • 性能优化:如果ComboBox选项或忙碌时间段数量较多,这种筛选方式比循环移除每个项更高效,因为LINQ的批量处理减少了UI控件的操作次数
  • 错误处理:添加try-catch块可以捕获时间解析、数据库连接等异常,提升程序稳定性

内容的提问来源于stack exchange,提问作者Joe Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:42:33