【问题标题】:Disabling/Disallowing items in ComboBox to be selected depending on selection ( C# )根据选择禁用/禁止选择 ComboBox 中的项目(C#)
【发布时间】:2009-12-09 00:51:50
【问题描述】:

我有两个组合框,一个列出一周中的 7 天,另一个列出一组时间(7 个不同的时间,每个时间作为字符串)。

我遇到的问题是我希望能够阻止用户根据所选日期/时间选择某些项目。

例如,周一早上 7 点到 9 点的组合框选项不应该可用,因为它是“预先预订的”,如果这有意义的话。

日期和时间用于 7x7 数组,组合框中的每个索引与数组中的一个元素相关,因此根据组合框中选定的索引,我可以使用正确的数组元素。

最好的方法是什么?我已经尝试了一系列 if 语句,但它会滑过它们并继续处理不应该的数据。

编辑:

添加了 jmatthews3865 的示例尝试

private void buttonOK_Click(object sender, EventArgs e)
    {
        if (comboBoxTime.SelectedIndex != 0 && comboBoxDay.SelectedIndex != 5 | comboBoxDay.SelectedIndex != 6)
        {
            if (comboBoxTime.SelectedIndex != 1 | comboBoxTime.SelectedIndex != 2 | comboBoxTime.SelectedIndex != 3
                && comboBoxDay.SelectedIndex != 0 | comboBoxDay.SelectedIndex != 1 | comboBoxDay.SelectedIndex != 2
                | comboBoxDay.SelectedIndex != 3 | comboBoxDay.SelectedIndex != 4)
            {
                if (comboBoxTime.SelectedIndex != 5 | comboBoxTime.SelectedIndex != 6 && comboBoxDay.SelectedIndex != 5
                    | comboBoxDay.SelectedIndex != 6)
                {
                    lock (this)
                    {

                        int date = this.comboBoxDay.SelectedIndex;
                        int time = this.comboBoxTime.SelectedIndex;

                        if (IsUser)
                        {
                            string fName = textBoxFName.Text;
                            string lName = textBoxLName.Text;
                            string pCode = textBoxPCode.Text;

                            AddUserBooking(date, time, fName, lName, pCode);
                        }
                        else
                        {
                            int mNo = int.Parse(textBoxMNo.Text);

                            AddMemberBooking(date, time, mNo);
                        }
                    }

                    CloseBookingForm();
                }
            }
        }
        else
        {
            MessageBox.Show("Select a valid Date/Time and try again");                
        }
    }

它似乎在第一个 if 语句块上运行良好,但失败了。

如果所选日期是星期六/星期日 ([5],[6]),则时间 [0] 和 [5],[6] 不可用。 周一至周五,包括[1]至[3]的时间不可用。

如果不是因为我的截止日期非常短,而且讲师无法做出合理的作业,那么我很乐意重构所有这些。

EDIT2:

我已经设法实现了一个似乎运行良好的系统。 它基于 Steven Adams 解决方案,该解决方案本质上在布尔方法中使用了 if 语句。 我在处理预订之前调用该方法,如果它返回 true,则可以进行预订,否则会显示一个消息框,并显示相应的错误。

【问题讨论】:

  • 您使用的是 Windows 窗体还是 Web 窗体?
  • 如果您将检查预订是否有效移出,它将澄清您的代码,例如isValidAppointmentTime(date,start,finish)->Boolean 而不是所有那些 ifs。我可能读错了,但请检查第三个 if 语句中的大括号
  • 你说得对,它会让它变得更干净、更简单。我一定会这样做的

标签: c# combobox


【解决方案1】:

我会第二个 cdonners 评论。具有禁用选项的组合框对于用户来说可能是一个非常混乱的情况。有没有办法根据时间段是否已经预订来过滤选项?

某种显示时间范围的自定义控件将是这样的理想形式。通过这种方式,您可以加载现有事件,以便用户能够了解他们无法选择特定时间范围的原因。我知道这可能比你想要的更进一步。

我在想this 之类的东西...(假设是 asp.net,而不是 winforms)

但如果您打算使用组合框,我会采用 cdonners 的建议,或者您可以处理 OnSelectedIndexChanged 事件以验证所选选项是否可用,如果不可用则通知用户。听起来这可能是你现在想要做的。你能发布不起作用的代码吗?

编辑:

看起来你让这件事变得复杂得多。但因为这似乎是家庭作业(如果我错了,请纠正我)我不想只写一个解决方案。此外,如果合适,您应该将您的问题标记为作业。

  1. 获取每个组合的选定索引值
  2. 确保选定的索引值一起有效
  3. 如果组合不是,则通知用户
  4. 否则,根据当前上下文是针对用户还是针对成员进行相应处理。

尝试将每个组合的可用值设置为两个单独的枚举并基于此进行处理,而不是对值进行硬编码。

【讨论】:

  • 哦,不,我已经完成了一项任务,我只是想添加一些验证以使用户更轻松。如果我有时间,我可能会从头开始重做整个事情。我会尝试你的建议,因为它似乎与我试图实现自己的目标相似。
【解决方案2】:

最直接的成功方法可能是在日期列表的 OnSelectedIndexChanged 事件处理程序中填充时间列表。您可以确定选择了哪一天,在您的数据源中查询当天的可用时间段,然后将结果绑定到时间组合框。

这是一个(不是很好)example,它使用国家和州。

【讨论】:

  • 不幸的是,我有一个包含日期和时间的 7x7 数组(想想时间表),并且根据选择的组合框元素,它会知道要在数组中使用哪个元素。如果我要动态更新组合框,那么我认为它会破坏我目前拥有的系统。遗憾的是,单个项目没有 .Enabled =[
  • 我想我明白你想做什么,但我不明白为什么我的建议不起作用。您在日期和时间之间存在依赖关系。首先用户选择一天,然后您知道要显示哪些时间以供选择。你的代码 sn-p 很难理解,所以那里有一个危险信号。
  • 我同意代码有点不可读,因为它是匆忙创建的,不幸的是我需要能够在组合框中提供所有选项,但只有几个可选(灰色无效的出)由于我的收藏作品的方式。如果我要重做,那么我肯定会按照你的方式做。
  • 那么你需要使用另一个控件。 DropdownList 不支持不可选择的项目。 forums.asp.net/t/1132654.aspx
  • 这是在 ASP.Net 中,我使用的是 C# 3.5
猜你喜欢
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多