根据选择禁用/禁止ComboBox中的项目(C#)

时间:2009-12-09 00:51:50

标签: c# combobox

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

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

一个例子是星期一7-9am comboBox选项不应该是可用的,因为它是“预先预订”,如果这是有道理的。

日期和时间用于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 statament。 我在处理预订之前调用该方法,如果它返回true,则可以进行预订,否则会显示一个消息框,其中包含适当的错误。

2 个答案:

答案 0 :(得分:2)

我会第二次发表评论。拥有带有禁用选项的组合框对用户来说可能是一个相当令人困惑的情况。是不是有办法根据时间段是否已经预订过滤选项?

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

this这样的东西就是我在想的......(假设是asp.net,而不是winforms)

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

编辑:

看起来你要让它变得更加复杂。但是因为看起来这是作业(如果我错了,请纠正我)我不想只写出一个解决方案。另外,如果合适,你应该将你的问题标记为作业。

  1. 抓取每个组合的选定索引值
  2. 确保所选索引值一起有效
  3. 如果组合不是,则通知用户
  4. 否则,根据当前上下文是针对用户还是成员进行相应处理。
  5. 尝试将每个组合的可用值设置为两个单独的枚举,然后根据它进行处理,而不是硬编码。

答案 1 :(得分:1)

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

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