将通用 List<string> 绑定到 ComboBox

Posted

技术标签:

【中文标题】将通用 List<string> 绑定到 ComboBox【英文标题】:Binding a generic List<string> to a ComboBox 【发布时间】:2010-12-09 07:15:52 【问题描述】:

我有一个 ComboBox,我想将一个通用列表绑定到它。谁能明白为什么下面的代码不起作用?绑定源中有数据,但不会填充 ComboBox 数据源。

FillCbxProject(DownloadData Down)

  BindingSource bindingSource = new BindingSource();
  bindingSource.DataSource = Down.ProjectList;
  cbxProjectd.DataSource = bindingSource;

附带说明:传递一个类的实例是不是很糟糕?

谢谢!

【问题讨论】:

你看到了什么?您是否分配了 DisplayMember 属性? 【参考方案1】:

你需要调用Bind方法:

cbxProjectd.DataBind();

如果这是针对 winforms 的,那么您需要确保调用的是您所拥有的,以下是有效的:

BindingSource bs = new BindingSource();
bs.DataSource = new List<string>  "test1", "test2" ;
comboBox1.DataSource = bs;

虽然你可以直接用列表设置ComboBox的DataSource。

【讨论】:

.DataBind 在哪里?它不会作为选项显示在智能感知中。 它适用于 web 表单,对于 win 表单,您的答案应该有效。您的程序的另一部分有问题。如果你隔离你的代码,它应该可以工作。 我只是做了更多的挖掘,发现了一个埋藏的异常,它确实冒了出来。谢谢大家。 @YuriyFaktorovich:请考虑删除答案的第一部分,因为他在问题中明确表示,这是针对 winforms 的。【参考方案2】:

这是简单的方法(它可以正常工作):

List<string> my_list = new List<string>();
my_list.Add("item 1");
my_list.Add("item 2");
my_list.Add("item 3");
my_list.Add("item 4");
my_list.Add("item 5");
comboBox1.DataSource = my_list;

【讨论】:

【参考方案3】:
BindingSource bs = new BindingSource();
bs.DataSource = getprojectname();
comboBox1 = new ComboBox();
comboBox1.DataSource = bs;

【讨论】:

【参考方案4】:

这是一个不使用BindingSource的相当简单的方法:

首先,将字符串的通用列表添加到“consts/utils”类中:

public static List<string> Months = new List<string>

   "Jan",
   "Feb",
   "Mar",
   "Apr",
   "May",
   "Jun",
   "Jul",
   "Aug",
   "Sep",
   "Oct",
   "Nov",
   "Dec"
;

以下是将这些字符串添加到组合框的方法:

comboBoxMonth.Items.AddRange(UsageRptConstsAndUtils.Months.ToArray<object>());

【讨论】:

【参考方案5】:

使用上面 Yuriy Faktorovich 的代码作为基础,这里是如何获取给定周数的 LongDateString 格式的日期列表,并将它们分配给组合框。这使用“星期一”,但您可以简单地将“星期一”替换为任何其他 DOW 以满足您的目的:

private void PopulateSchedulableWeeks()

    int WEEKS_COUNT = 13;
    List<String> schedulableWeeks = PlatypusUtils.GetWeekBeginnings(WEEKS_COUNT).ToList();
    BindingSource bs = new BindingSource();
    bs.DataSource = schedulableWeeks;
    comboBoxWeekToSchedule.DataSource = bs;


public static List<String> GetWeekBeginnings(int countOfWeeks)

    // from http://***.com/questions/6346119/datetime-get-next-tuesday
    DateTime today = DateTime.Today;
    // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
    int daysUntilMonday = ((int)DayOfWeek.Monday - (int)today.DayOfWeek + 7) % 7;
    DateTime nextMonday = today.AddDays(daysUntilMonday);

    List<String> mondays = new List<string>();
    mondays.Add(nextMonday.ToLongDateString());

    for (int i = 0; i < countOfWeeks; i++)
    
        nextMonday = nextMonday.AddDays(7);
        mondays.Add(nextMonday.ToLongDateString());
    
    return mondays;

...而且,如果您也想将实际日期添加到组合框中,您可以使用这样的字典:

    int WEEKS_TO_OFFER_COUNT = 13;
    BindingSource bs = new BindingSource();
    Dictionary<String, DateTime> schedulableWeeks = AYttFMConstsAndUtils.GetWeekBeginningsDict(WEEKS_TO_OFFER_COUNT);             bs.DataSource = schedulableWeeks;
    comboBoxWeekToSchedule.DataSource = bs;
    comboBoxWeekToSchedule.DisplayMember = "Key";
    comboBoxWeekToSchedule.ValueMember = "Value";

public static Dictionary<String, DateTime> GetWeekBeginningsDict(int countOfWeeks)

    DateTime today = DateTime.Today;
    // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
    int daysUntilMonday = ((int)DayOfWeek.Monday - (int)today.DayOfWeek + 7) % 7;
    DateTime nextMonday = today.AddDays(daysUntilMonday);

    Dictionary<String, DateTime> mondays = new Dictionary<String, DateTime>();
    mondays.Add(nextMonday.ToLongDateString(), nextMonday);

    for (int i = 0; i < countOfWeeks; i++)
    
        nextMonday = nextMonday.AddDays(7);
        mondays.Add(nextMonday.ToLongDateString(), nextMonday);
    
    return mondays;

【讨论】:

【参考方案6】:

如果有人发现这个 necro 线程,请确保您的列表不包含 null 项。 否则绑定会静默失败!

//This will not work!
comboBox1.DataSource = new List<string>  "test1", null, "test2" ;

//This is legit!
comboBox1.DataSource = new List<string>  "test1", "", "test2" ;

【讨论】:

以上是关于将通用 List<string> 绑定到 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

如何将 List<string> 绑定到 DataGridView 控件?

WPF:将 DataGrid 绑定到 List<String>

将 List<string> 绑定到 ComboBox

将 Picker ItemSource 绑定到 List<string> 不起作用 Xamarin.forms MVVM

绑定到 List<string> 时如何使 ListBox 可编辑?

WPF将comboBox绑定到List