用数月和数字填充组合框几个月

时间:2013-04-07 09:34:08

标签: c# wpf combobox

我正在开发一个WPF项目,我有一个月的组合框应该包含从1月到12月的几个月。我设法通过以下片段来完成;

var americanCulture = new CultureInfo("en-US");
ddlMonth.Items.AddRange(americanCulture.DateTimeFormat.MonthNames);

并将列表作为;

January
February
March
....

但我希望他们填充为;

01 - January
02 - February
03 - March
.....

任何想法如何继续循环?我是C#的新手。感谢

4 个答案:

答案 0 :(得分:6)

野应。你为什么要在后端做这件事。利用wpf并使用xaml。

让我试着解释一下如何做到这一点。

  1. 首先为Months创建一个依赖项属性。如果您还没有使用依赖项属性。你现在应该研究它们http://wpftutorial.net/DependencyProperties.html。在下面的代码中,我通过新的PropertyMetadata(new CultureInfo(“en-US”)将Date属性的默认值设置为月份列表.DateTimeFormat.MonthNames.Take(12).ToList()))。所以现在我们可以从xaml获取这个属性。

    public partial class MainWindow : Window
    {
    public static readonly DependencyProperty MonthsProperty = DependencyProperty.Register(
        "Months", 
        typeof(List<string>), 
        typeof(MainWindow), 
        new PropertyMetadata(new CultureInfo("en-US").DateTimeFormat.MonthNames.Take(12).ToList()));
    
    public List<string> Months
    {
        get
        {
            return (List<string>)this.GetValue(MonthsProperty);
        }
    
        set
        {
            this.SetValue(MonthsProperty, value);
        }
    }
    public MainWindow()
    {
        InitializeComponent();            
    }
    

    }

  2. 您需要一个转换器。 http://wpftutorial.net/ValueConverters.html如果不熟悉它们。转换器将要做的是列表中的每个值,我们将修改字符串以获得所需的结果。因此,为值转换器创建一个新类。

    [ValueConversion(typeof(List<string>), typeof(List<string>))]
    public class MonthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
        //get the list of months from the object sent in    
        List<string> months = (List<string>)value;
    
        //manipulate the data index starts at 0 so add 1 and set to 2 decimal places
        if (months != null && months.Count > 0)
        {
            for (int x = 0; x < months.Count; x++)
            {
                months[x] = (x + 1).ToString("D2") + " - " + months[x];
            }
        }
    
        return months;
    }
    
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    
    #endregion
    

    }

  3. 在xaml中设置它。为您的窗口创建一个名称,即x:Name =“testWindow”,这样可以在绑定时更好地访问它。设置命名空间,以便获得转换器。 的xmlns:主要= “CLR的命名空间:WpfApplication4”。将转换器添加到资源中。在组合框中,将itemssource绑定到您的依赖项属性Months并通过转换器发送它。

    <Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="testwindow"
        xmlns:Main="clr-namespace:WpfApplication4"
        Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <Main:MonthConverter x:Key="MonthConverter"/>
        </Window.Resources>
    
        <Grid>
            <ComboBox ItemsSource="{Binding ElementName=testwindow,Path=Months, Converter={StaticResource MonthConverter}}" HorizontalAlignment="Left" Margin="197,107,0,0" VerticalAlignment="Top" Width="120"/>
    
        </Grid>
    </Window>
    

答案 1 :(得分:4)

      var americanCulture = new CultureInfo("en-US");
      var count = 1;
      //.Take(12) in the foreach below because apparantly MonthNames returns 13
      //elements of which the last one is empty
      foreach (var month in americanCulture.DateTimeFormat.MonthNames.Take(12))
      {    
      DropDownList1.Items.Add(new ListItem{Text = count.ToString("00") + "-" + month});
      count++;
      }

答案 2 :(得分:2)

试试这个:

   List<string> names = new List<string>();
        int num = 1;
        foreach (var item in americanCulture.DateTimeFormat.MonthNames)
        {
            names.Add(string.Format("{0} - {1}", num++.ToString("D2"), item));
        }
        ddlMonth.Items.AddRange(names);

答案 3 :(得分:2)

最好的办法就是拥有当天的组合框和本月的组合框。

Populating month and day

用途

for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++) {
    cmbDay.Items.Add(i.ToString());
}