2009-10-22 10 views
15

Ich habe eine ComboBox und ich möchte eine generische Liste daran binden. Kann jemand sehen, warum der folgende Code nicht funktioniert? Die Bindungsquelle enthält Daten, aber die ComboBox-Datenquelle wird nicht gefüllt.Binding eine generische Liste <string> zu einer ComboBox

FillCbxProject(DownloadData Down) 
{ 
    BindingSource bindingSource = new BindingSource(); 
    bindingSource.DataSource = Down.ProjectList; 
    cbxProjectd.DataSource = bindingSource; 
} 

Nebenbei bemerkt: Ist es schlecht, eine Instanz einer Klasse zu übergeben?

Danke!

+0

Was sehen Sie? Haben Sie die Eigenschaft DisplayMember zugewiesen? –

Antwort

26

Sie müssen die Bind-Methode aufzurufen:

cbxProjectd.DataBind(); 

Wenn dies für WinForms ist, dann müssen Sie sicherstellen, was Sie genannt wird, folgende Arbeiten:

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

Obwohl Sie kann die DataSource der ComboBox direkt mit der Liste festlegen.

+2

Wo ist .DataBind bei? Es erscheint nicht als Option in Intellisense. – Nathan

+0

Es ist für Webformulare, für Gewinnformen sollte Ihre Antwort funktionieren. In einem anderen Teil Ihres Programms stimmt etwas nicht. Wenn Sie Ihren Code isolieren, sollte es funktionieren. –

+0

Ich habe graben und habe eine vergrabene Ausnahme gefunden, die aus gutem Grund aufgetaucht ist. Danke an alle. – Nathan

3

dies ist die einfache Art und Weise (es funktioniert richtig):

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; 
0
BindingSource bs = new BindingSource(); 
bs.DataSource = getprojectname(); 
comboBox1 = new ComboBox(); 
comboBox1.DataSource = bs; 
0

Dies ist eine ziemlich einfache Art und Weise, die nicht Binding nicht verwendet:

ersten, die generische Liste der Zeichenfolge hinzufügen vielleicht zu einer „consts/utils“ Klasse:

public static List<string> Months = new List<string> 
{ 
    "Jan", 
    "Feb", 
    "Mar", 
    "Apr", 
    "May", 
    "Jun", 
    "Jul", 
    "Aug", 
    "Sep", 
    "Oct", 
    "Nov", 
    "Dec" 
}; 

Und hier, wie Sie diese Zeichenfolge zu einem Kombinationsfeld hinzuzufügen:

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

Yuriy Faktorowitsch des Code oben als Basis, hier ist, wie eine Liste der Termine für eine bestimmte Anzahl von Wochen in LongDateString Format zu bekommen, und sie zu einem Kombinationsfeld zuweisen. Dies nutzt „Montag“, aber Sie können einfach ersetzen „Montag“ mit jedem anderen DOW Ihre Zwecke anpassen:

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://stackoverflow.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; 
} 

... und, wenn Sie das aktuelle Datum an das Kombinationsfeld hinzufügen möchten auch Sie kann ein Wörterbuch wie folgt verwenden:

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; 
} 
Verwandte Themen