【问题标题】:How can I populate a "Months" combobox and a "Years" combobox from a supplied year, and have their values default to the last month?如何从提供的年份填充“月份”组合框和“年”组合框,并将它们的值默认为上个月?
【发布时间】:2016-03-25 16:18:30
【问题描述】:

我需要让用户选择月份和年份。通常,他们会选择最后一个月(例如,如果是 2015 年 12 月 18 日,他们通常会选择 2015 年 11 月)。所以我希望这些值是组合框中预先选择的值。

我怎样才能做到这一点(在 C# 中),并且一旦越过卢比孔河(幼发拉底河?)到 2016 年 1 月,它也是“2015 年 12 月”?

我还希望它在 2016 年之前不要添加 2016 年(依此类推,随着岁月的流逝)并从预定的年份开始(不是 0 年或 1970 年或类似的东西,必然)。

【问题讨论】:

    标签: c# .net winforms date combobox


    【解决方案1】:

    您可以使用DateTimeFormatInfo.MonthNames 查找文化的月份名称。 有些文化有 13 个月,所以 DateTimeFormat.MonthNames 返回一个包含 13 个月的数组。

    但由于您似乎想使用公历,您只需要使用 12 个月的名称,我使用 InvariantCulture 来获取月份名称。

    你可以使用这样的代码:

    monthComboBox.DataSource = CultureInfo.InvariantCulture.DateTimeFormat
                                                         .MonthNames.Take(12).ToList();
    monthComboBox.SelectedItem = CultureInfo.InvariantCulture.DateTimeFormat
                                            .MonthNames[DateTime.Now.AddMonths(-1).Month - 1];
    
    yearComboBox.DataSource = Enumerable.Range(1983, DateTime.Now.Year - 1983 + 1).ToList();
    yearComboBox.SelectedItem = DateTime.Now.Year;
    

    您可以使用CurrentCulture 或其他您喜欢的文化。

    【讨论】:

    • 对于当前月份更改这部分代码:.MonthNames[DateTime.Now.AddMonths(-1).Month]
    【解决方案2】:

    这应该可以工作(假设您的组合框所在的表单名为“mainForm”,组合框名为“comboBoxMonth”和“comboBoxYear”):

    private void mainForm_Shown(object sender, EventArgs e)
    {
        PopulateMonthsAndYears();
    }
    
    private void PopulateMonthsAndYears()
    { 
        const int DECEMBER = 11;
        const int BEGIN_YEAR = 1983; // KCMS
        comboBoxMonth.Items.AddRange(PlatypusConstsAndUtils.MonthsFull.ToArray<object>());
        comboBoxMonth.SelectedIndex = PlatypusConstsAndUtils.GetIndexForPreviousMonth();
    
        comboBoxYear.DataSource = Enumerable.Range(BEGIN_YEAR, DateTime.Now.Year - BEGIN_YEAR + 1).ToList();
        comboBoxYear.SelectedIndex = comboBoxYear.Items.IndexOf(DateTime.Now.Year);
    
        // However, if it is January (and thus the month is set to December), set the year to previous also
        if (comboBoxMonth.SelectedIndex == DECEMBER)
        {
            comboBoxYear.SelectedIndex = comboBoxYear.Items.IndexOf(DateTime.Now.Year - 1);
        }
    }
    

    ...以及保存月份 vals 的类(当然,您可以将字符串 vals 更改为西班牙语或德语或克林贡语或任何“漂浮在您的船上”):

    public static class PlatypusConstsAndUtils
    {
    
        public static List<string> MonthsFull = new List<string>
        {
                "January",
                "February",
                "March",
                "April",
                "May",
                "June",
                "July",
                "August",
                "September",
                "October",
                "November",
                "December"
        };
    
        public static int GetIndexForPreviousMonth()
        {
            // Months are 1-based, but return the index, which is 0-based, so decrement it
            const int JANUARY = 1;
            const int DECEMBER = 12;
            int prevMonth;
            int currentMonth = DateTime.Now.Month;
            if (currentMonth == JANUARY)
            {
                prevMonth = DECEMBER - 1;
            }
            else
            {
                prevMonth = DateTime.Now.Month - 2;
            }
            return prevMonth;
        }
        . . .
    

    【讨论】:

    猜你喜欢
    • 2019-08-24
    • 2016-10-30
    • 1970-01-01
    • 2019-04-15
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2022-01-07
    相关资源
    最近更新 更多