2009-10-22 10 views
15

J'ai une zone de liste déroulante et je veux lier une liste générique à elle. Quelqu'un peut-il voir pourquoi le code ci-dessous ne fonctionnera pas? La source de liaison contient des données, mais elle ne remplira pas la source de données ComboBox.Liaison d'une liste générique <string> à une zone de liste déroulante

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

Sur une note latérale: Est-il mauvais de passer autour d'une instance d'une classe?

Merci!

+0

Que voyez-vous? Avez-vous attribué la propriété DisplayMember? –

Répondre

26

Vous devez appeler la méthode Bind:

cbxProjectd.DataBind(); 

Si ceci est pour WinForms, alors vous devez vous assurer que ce que vous avez est appelé, les travaux suivants:

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

Bien que vous peut définir DataSource de la ComboBox directement avec la liste.

+2

Où est situé .DataBind? Il n'apparaît pas dans intellisense comme une option. – Nathan

+0

C'est pour les formulaires Web, pour gagner des formulaires, votre réponse devrait fonctionner. Il y a quelque chose qui ne va pas dans une autre partie de votre programme. Si vous isolez votre code, cela devrait fonctionner. –

+0

Je viens de creuser plus et j'ai trouvé une exception enfouie qui a éclaté de la raison. Merci tout le monde. – Nathan

3

c'est la façon simple (il fonctionne correctement):

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

Voici une façon assez simple qui n'utilise pas BindingSource:

d'abord, ajoutez la liste générique de chaîne , peut-être à une classe « Const/utils »:

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

Et voici comment ajouter ces chaînes à une zone de liste déroulante:

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

En utilisant le code de Yuriy Faktorovich ci-dessus comme base, voici comment obtenir une liste des dates au format LongDateString pour un nombre donné de semaines, et les affecter à une zone de liste déroulante. Celui-ci utilise « lundi », mais vous pouvez simplement remplacer « lundi » avec tout autre DOW pour répondre à vos besoins:

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

... et, si vous voulez ajouter la date réelle à la zone de liste déroulante, aussi, vous peut utiliser un dictionnaire comme ça:

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; 
} 
Questions connexes