2009-05-01 19 views
10

我有一個內部應用程序,我需要有兩個日期類型元素的下拉列表:。這些值不在數據庫或其他信息庫中。爲ASP.NET編寫月份和年份下拉列表的最佳方式是什麼?

我知道我可以只設置一個與我需要將它們添加到像對象字典值列表(我需要每月關聯到數字表示一月=> 01):

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

這一年的下拉列表會稍微簡單一點,因爲我可以選擇一個開始年份,並在通用列表中迭代到當前或當前的+ 1年。

有沒有更好的方法來處理這些數據元素?內置的東西,還是我應該實現的一個好的設計模式?

+0

有趣的問題,我有同樣的問題一次。 +1 – pyrocumulus 2009-05-01 17:43:37

+0

你需要本地化這個值嗎? – Greg 2009-05-01 17:46:23

+0

本地化不是必需條件,但是如果它已經存在於本地化狀態中,它不會受到傷害。 – 2009-05-01 17:55:18

回答

23

您可以使用它來獲取所有月份名稱的列表並循環遍歷它。

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

是否有辦法用數字表示來腐蝕月份名稱(即1月=> 1)? – 2009-05-01 17:34:47

+0

檢查編輯,我添加它的用法。 – Jab 2009-05-01 17:45:38

4

擴展@Jesse布朗的回答值這樣使用它......

隨着使用System.Globalization指令,我有以下代碼:

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

這會產生看起來像一個下拉列表:

01月01日 02月02日三月... 12月12日

進一步的改進可能是通過增加使顯示的月份當月:

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

之後的for循環。

2

這裏是我的解決方案,這是非常相似@傑西褐色的溶液(公認的答案)

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社區。

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

下面的代碼是用於負載月下拉爲選擇

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())); 
     } 
    } 
相關問題