Как мне заполнить C # ComboBox именами последних 4 месяцев? - PullRequest
0 голосов
/ 29 мая 2011

Я хочу отображать имена последних 4 месяцев в ComboBox, используя C #. Когда пользователь выбирает месяц, мне нужно передать дату / время запросу. Как я могу отобразить название месяца, используя в качестве значения дату / время?

Ответы [ 3 ]

2 голосов
/ 29 мая 2011

Свяжите ваше поле со списком с помощью DisplayMember = 'Month Name' и ValueMember = theDateTime

ListItemCollection items = new ListItemCollection();
DateTime now = DateTime.Now;
for (int count = 1; count <= 4; count++)
{
    items.Add(new ListItem(now.ToString("MMM"), now.ToString()));
    now.AddMonths(-1);
}
combobox.DisplayMember = "Text";
combobox1.ValueMember = "Value";
combobox1.DataSource = items;

Затем получите выбранное пользователем значение в дату и время

DateTime selected = Convert.ToDateTime(combobox1.SelectedValue);
0 голосов
/ 29 мая 2011

enter image description here

Еще одна идея: приведенное ниже решение хранит реальное значение DateTime в списке, а не только месяц, например, 01.05.2011. Когда выбрано поле со списком, на выходе действительно будет дата.

Код:

    public MainWindow()
    {
        InitializeComponent();

        MyMonths = new List<DateTime>();
        var thisMonth = new DateTime(
            DateTime.Now.Year,
            DateTime.Now.Month,
            1);

        for (var i = 0; i < 4; i++)
        {
            MyMonths.Add(thisMonth.AddMonths(-i));
        }

        this.DataContext = this;
    }

    public List<DateTime> MyMonths
    {
        get { return (List<DateTime>)GetValue(MyMonthsProperty); }
        set { SetValue(MyMonthsProperty, value); }
    }
    public static readonly DependencyProperty MyMonthsProperty =
        DependencyProperty.Register("MyMonths", typeof(List<DateTime>), typeof(MainWindow), new UIPropertyMetadata(null));      

Xaml:

    <StackPanel>
        <ComboBox x:Name="dateCombo" 
                  Margin="10"
                  SelectedIndex="0"
                  ItemsSource="{Binding MyMonths}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource dateTimeConverter}}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </StackPanel>

DateTimeConverter:

public class DateTimeConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is DateTime)
        {
            var d = (DateTime)value;
            return d.ToString("MMM");
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Обновление: Для форматирования месяца:

String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
0 голосов
/ 29 мая 2011

Вы не даете много с точки зрения деталей.Я предполагаю, что значение выбранного месяца является целым числом.Вы можете создать фиктивный объект DateTime, который будет иметь в качестве заполнителя значение вашего месяца:

new DateTime(DateTime.Now.Year, selectedMonth, DateTime.Now.Day);
...