编写ASP.NET的月份和年份下拉列表的最佳方法是什么?

时间:2009-05-01 17:21:55

标签: c# asp.net vb.net webforms

我有一个内部应用程序,我需要有两个日期类型元素的下拉列表:。这些值不在数据库或其他信息库中。

我知道我可以通过将它们添加到像对象这样的字典中来设置一个包含我需要的值的列表(我需要将Month与数字表示相关联,January => 01):

var months = new Dictionary<String,String>();
months.Add("01", "January");
...

今年的下拉列表会更容易,因为我可以选择一个起始年份并在通用列表中迭代到当前或当前的+ 1年。

有没有更好的方法来处理这些数据元素?内置的东西,或者我应该实现的好的设计模式?

9 个答案:

答案 0 :(得分:30)

您可以使用它来获取所有月份名称的列表并循环显示它。

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

您可以像这样使用它...使用Month的索引作为下拉列表的值

var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
for (int i = 0; i < months.Length; i++)
{
     ddl.Items.Add(new ListItem(months[i], i.ToString()));
}

答案 1 :(得分:4)

延长@Jesse Brown的答案......

使用使用System.Globalization 指令,我有以下代码:

for (int x = 0; x < 12; x++)
{
    cboMonth.Items.Add
    (
       (x+1).ToString("00") 
       + " " 
       + CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(x)
     );
}

这会产生一个下拉列表,如下所示:

1月1日 2月2日 3月3日 ... 12月12日

进一步细化可能是通过添加以下内容使显示的月份成为当月:

cboMonth.Text = DateTime.Now.Month.ToString("00") 
   + " " 
   + CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(DateTime.Now.Month);

在for循环之后。

答案 2 :(得分:2)

这是我的解决方案,与@ jesse-brown的解决方案非常相似(接受的答案)

VB.NET:

在全局函数类中:

Public Shared Function GetMonthList() As Generic.Dictionary(Of String, String)
    Dim months As New Generic.Dictionary(Of String, String)()
    For m As Int32 = 1 To 12
        months.Add(String.Format("{0:0#}", m), CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(m))
    Next

    Return months
End Function

在ASPX页面上:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ddMonth.DataSource = GlobalFunctions.GetMonthList()
    ddMonth.DataValueField = "Key"
    ddMonth.DataTextField = "Value"
    ddMonth.DataBind()

End Sub

这个实现是在VB.NET中,因为这恰好是这个webapp使用的(遗留的),但是非常感谢C#中的例子(我的首选语言),我在这里发布了VB.NET也帮助VB.NET社区。

答案 3 :(得分:2)

对于ASP.NET MVC,这就是我正在做的事情。

注意I prefer to use a codebehind这样的事情 - 它仍然是视图的一部分,构建SelectList的视图没有任何问题。

<强> PaymentControl.ascx

 <%= Html.DropDownList("ExpirationMonth", ExpirationMonthDropdown)%> / 
 <%= Html.DropDownList("ExpirationYear", ExpirationYearDropdown)%>

<强> PaymentControl.ascx.cs

public partial class PaymentControl : ViewUserControl<CheckoutModel>
    {
        public IEnumerable<SelectListItem> ExpirationMonthDropdown
        {
            get
            {
                return Enumerable.Range(1, 12).Select(x =>

                    new SelectListItem()
                    {
                        Text = CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[x - 1] + " (" + x + ")",
                        Value = x.ToString(),
                        Selected = (x == Model.ExpirationMonth)
                    });
            }
        }

        public IEnumerable<SelectListItem> ExpirationYearDropdown
        {
            get
            {
                return Enumerable.Range(DateTime.Today.Year, 20).Select(x =>

                new SelectListItem()
                {
                    Text = x.ToString(),
                    Value = x.ToString(),
                    Selected = (x == Model.ExpirationYear)
                });
            }
        }
    }

答案 4 :(得分:2)

以下代码用于选择

的加载月份下拉列表
    private void LoadMonth()
    {
        ddlmonth.Items.Add(new ListItem("Select", 0.ToString()));
        var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
        for (int i = 0; i < months.Length-1; i++)
        {
            ddlmonth.Items.Add(new ListItem(months[i], (i+1).ToString()));
        }
    }

答案 5 :(得分:1)

 public void bind_month()
    {
        var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;

        ddl_month.Items.Insert(0, new ListItem("--Select--", "0"));

        for (int i = 0; i < months.Length-1; i++)
        {
            ddl_month.Items.Add(new ListItem(months[i],(i+1).ToString()));
        }

    }

答案 6 :(得分:1)

有人问他们想要月份的数字表示。这是我的代码隐藏:

// DOB MONTHS
dob_month1.Items.Insert(0, new ListItem("Select", "")); 
var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
for (int i = 1; i < months.Length; i++)
{
    dob_month1.Items.Add(new ListItem(i.ToString(), i.ToString()));
}

与答案代码基本一致,略有调整。

结果:

enter image description here

答案 7 :(得分:0)

/ 尝试使用此代码将下拉列表中的所有月份绑定在一起,而不使用数据库 /

 public void GetMonthList(DropDownList ddl)
    {
        DateTime month = Convert.ToDateTime("1/1/2000");
        for (int i = 0; i < 12; i++)
        {
            DateTime NextMont = month.AddMonths(i);
            ListItem list = new ListItem();
            list.Text = NextMont.ToString("MMMM");
            list.Value = NextMont.Month.ToString();
            ddl.Items.Add(list);
        }
        //ddl.Items.Insert(0, "Select Month");
        ddl.Items.FindByValue(DateTime.Now.Month.ToString()).Selected = true;
    }

答案 8 :(得分:-1)

你可以尝试这个......  参考文献:

http://allinworld99.blogspot.com/2015/01/bind-monthsyear-dropdownlist-c-aspnet.html

for (int i = 1; i <= 12; i++)
{
    drpBMonth.Items.Add(new System.Web.UI.WebControls.ListItem(DateTimeFormatInfo.CurrentInfo.GetMonthName(i), i.ToString()))};