我有一个由组合框组成的程序:
让设计师喜欢:
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等等。有任何想法请指教。
答案 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;
}
}