禁用comboBox中选择项的可见性

时间:2014-03-18 02:32:28

标签: c# winforms combobox

我有一个由组合框组成的程序:

enter image description here

让设计师喜欢:

        this.month_list.AllowDrop = true;
        this.month_list.FormattingEnabled = true;
        this.month_list.Items.AddRange(new object[] {
        "JAN",
        "FEB",
        "MAR",
        "APR",
        "MAY",
        "JUN",
        "JUL",
        "AUG",
        "SEP",
        "OCT",
        "NOV",
        "DEC"});
        this.month_list.Location = new System.Drawing.Point(35, 13);
        this.month_list.Name = "month_list";
        this.month_list.Size = new System.Drawing.Size(75, 24);
        this.month_list.TabIndex = 13;  

现在我的问题是,如果月份选项是将来还是当月的旁边,可以禁用月份选择可见性?或者换句话说现在说是3月,所以用户将无法点击APR,MAY等等。有任何想法请指教。

4 个答案:

答案 0 :(得分:2)

ComboBox.SelectedIndexChanged年添加处理程序,并在其中根据所选的当前日期和年份重新填充月份列表。

如果年份是2014年,则不要将大于当前月份的月份添加到月份列表中。

编辑:

private void yearCombo_SelectedIndexChanged(object sender, EventArgs e)
{
    if(int.Parse(yearCombo.Text) > DateTime.Now.Year)
    {
        //remove all entries from ComboBox
    }
    else if (int.Parse(yearCombo.Text) == DateTime.Now.Year)
    {
        //Just add the months up to current month
    }
    else
    {
        //Add all months
    }
}

答案 1 :(得分:2)

遗憾的是,VS2003-2005仅支持组合框中的禁用项目。

您只能通过以下代码删除它们(如果您想从现有的组合框中删除该项目):

// To remove item with index 0:
this.month_list.Items.RemoveAt(0);
// To remove currently selected item:
this.month_list.Items.Remove(this.month_list.SelectedItem);
// To remove "JAN" item:
this.month_list.Items.Remove("JAN");

下面的代码结合了Luc Morin的回答jonathanh8686的答案,您可能会觉得它有用:

首先你要制作一本字典,就像jonathanh8686的回答所说:

Dictionary<int,string> months = new Dictionary<int,string>(); 
months.add(1, "Jan");
months.add(2, "Feb");

然后,每当用户更改年份组合框时,您将月份组合框重置如下:

private void yearCombo_SelectedIndexChanged(object sender, EventArgs e)
{
    if(int.Parse(yearCombo.Text) > DateTime.Now.Year)
    {
        //remove all entries from ComboBox
        this.month_list.Items.Clear();
    }
    else if (int.Parse(yearCombo.Text) == DateTime.Now.Year)
    {
        //Just add the months up to current month
        this.month_list.Items.Clear();
        int monthnumber = 1;

        while(monthnumber <= DateTime.Now.Month)
        {
            this.month_list.Items.Add(months[monthnumber]);
            monthnumber++;
        }
    }
    else
    {
        //Add all months
        this.month_list.Items.Clear();
        int monthnumber = 1;

        while(monthnumber <= 12)
        {
            this.month_list.Items.Add(months[monthnumber]);
            monthnumber++;
        }

    }
}

答案 2 :(得分:1)

我是C#的新手,所以我不是最好的人回答这一点,但我知道如何做到这一点 我不确定这个的确切代码,但有一个可以使用的想法:

制作包含月份的日期时间

int month = 1;
int monthnumber = 1;
Datetime dt = new DateTime();

然后你可以创建一个字典,其中包含月份的密钥和月份的密钥,如下所示:

Dictionary<int,string> months = new Dictionary<int,string>(); 
months.add(1, "Jan");
months.add(2, "Feb");

依旧...... 之后检查月份并查看当月,如果是3月

if(dt.Month = March)
 {
     month = 3;
 }

然后呢 像这样添加所有小于3的月份:

while(monthnumber < months)
{
    this.month_list.Items.Add(dates.Value);
    monthnumber++;
}

答案 3 :(得分:1)

您必须编写自定义代码以自行绘制组合框的项目。

将这些事件处理程序添加到月份列表中:

this.month_list.DrawMode = DrawMode.OwnerDrawFixed;
this.month_list.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);
this.month_list.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);


Font font = new Font("Aerial", 10, FontStyle.Regular);
bool DisableIndex(int index)
    {
        return index > DateTime.Now.Month - 1;
    }
    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        Brush brushToDrawWith = DisableIndex(e.Index) ? Brushes.LightSlateGray : Brushes.Black;
        e.Graphics.DrawString(this.month_list.Items[e.Index].ToString(), font, brushToDrawWith, e.Bounds);
    }
    void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (DisableIndex(month_list.SelectedIndex))
        {
            month_list.SelectedIndex = -1;
        }
    }