ASP.NETの月と年のドロップダウンリストをコーディングする最良の方法は何ですか?
質問
内部アプリケーションがあり、2つの日付タイプ要素( Month および Year )のドロップダウンリストが必要です。これらの値は、データベースまたはその他の情報リポジトリにはありません。
オブジェクトのような辞書に追加することで、必要な値のリストを設定できることを知っています(月を数値表現に関連付ける必要があります、1月= gt; 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)
);
}
これにより、次のようなドロップダウンリストが生成されます。
01 1月 2月2日 3月3日 ... 12月12日
さらに改良して、以下を追加して、表示されている月を現在の月にすることができます:
cboMonth.Text = DateTime.Now.Month.ToString("00")
+ " "
+ CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(DateTime.Now.Month);
forループの後。
ここに私の解決策があります。これは@ 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)
});
}
}
}
以下のコードは、選択
としての読み込み月ドロップダウン用です 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()));
}
}
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()))};