【问题标题】:What is the best way to code up a Month and Year drop down list for ASP.NET?为 ASP.NET 编写月份和年份下拉列表的最佳方法是什么?
【发布时间】:2010-10-23 04:14:51
【问题描述】:

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

我知道我可以通过将所需的值添加到类似对象的字典中来设置一个列表(我需要将月份与数字表示相关联,一月 => 01):

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

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

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

【问题讨论】:

  • 有趣的问题,我曾经有过同样的问题。 +1
  • 你需要本地化这个值吗?
  • 本地化不是必需的,但是如果它已经以本地化状态存在,它不会受到伤害。

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


【解决方案1】:

您可以使用它来获取所有月份名称的列表并遍历它。

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

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

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

【讨论】:

  • 有没有办法将月份名称与数字表示(即一月 => 1)相关联?
  • CultureInfo.InvariantCulture.DateTimeFormat.MonthNames 返回的数组包含“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”和“”。您可以使用 for 循环来获取每个值的索引。
  • 很好的答案!我喜欢 StackOverflog——我真的每天至少学习两次新东西。我在另一个答案中添加了我对@Jesse Brown 的回答的贡献。
  • 我看到的唯一问题是:返回的月份名称数组的顺序是否会保持不变(如果顺序搞砸了,一月可能会突然编号为 5)。这是我对这种方法唯一关心的问题。
  • 请务必查看 DateTimeFormat 上的其他属性 - 例如 AbbreviatedMonthNames。不要只做 substring(0,3) !!
【解决方案2】:

扩展@Jesse Brown 的答案...

使用 using 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 循环之后。

【讨论】:

    【解决方案3】:

    这是我的解决方案,与@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 社区。​​p>

    【讨论】:

      【解决方案4】:

      下面的代码是加载月份下拉菜单 Select

          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】:

      对于 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)
                      });
                  }
              }
          }
      

      【讨论】:

      • 一旦我在我的模型类中使用这个public IEnumerable&lt;SelectListItem&gt; ExpirationMonthDropdown {,我就会收到以下错误The name 'Model' does not exist in the current context
      【解决方案6】:
       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()));
              }
      
          }
      

      【讨论】:

        【解决方案7】:

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

        // 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()));
        }
        

        与答案代码基本相同,稍作调整。

        结果:

        【讨论】:

          【解决方案8】:

          /试试这个代码在不使用数据库的情况下绑定下拉列表中的所有月份/

           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;
              }
          

          【讨论】:

            【解决方案9】:

            你可以试试这个... 参考这里:

            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()))};
            

            【讨论】:

            • 您好,这里不鼓励仅链接答案和仅代码答案。您能否编辑您的答案以解释这如何解决 OP 的问题?
            猜你喜欢
            • 1970-01-01
            • 2013-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            • 2021-05-24
            • 1970-01-01
            相关资源
            最近更新 更多