[英]What is the best way to code up a Month and Year drop down list for ASP.NET?
我有一個內部應用程序,我需要有兩個日期類型元素的下拉列表: Month和Year 。 這些值不在數據庫或其他信息存儲庫中。
我知道我可以通過將它們添加到類似對象的字典中來設置包含我需要的值的列表(我需要將月份與數字表示相關聯,一月 => 01):
var months = new Dictionary<String,String>();
months.Add("01", "January");
...
年份的下拉列表會更容易一些,因為我可以選擇一個起始年份並在通用列表中迭代到當前或當前+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()));
}
擴展@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 循環之后。
下面的代碼是加載月份下拉選擇
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()));
}
}
這是我的解決方案,它與@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 社區也是如此。
對於 ASP.NET MVC,這就是我正在做的。
注意我更喜歡使用代碼隱藏來處理這樣的事情 - 它仍然是視圖的一部分,並且構建 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 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()));
}
}
/試試這個代碼在不使用數據庫的情況下綁定下拉列表中的所有月份/
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;
}
你可以試試這個……參考這里:
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()))};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.