2010-05-18 3 views
2

J'ai une "zone de liste déroulante" et j'en suis tellement heureux que j'ai même commencé à utiliser d'autres combobox. Il prend l'objet combobox par référence avec l'ID de "l'ensemble de valeurs" (ou ce que vous voulez l'appeler) d'une table et ajoute les éléments et leurs valeurs respectives (qui diffèrent) et fait le travail. J'ai récemment eu la brillante idée d'utiliser des comboboxes dans un gridview, et j'ai été heureux de constater que cela fonctionnait JUSTE COMME une seule combobox, mais en remplissant tous les comboboxes dans la colonne donnée en même temps.Remplissage d'éléments et de valeurs ComboBoxDataColumn

ObjComboBox.Items.Add("yadayada"); 
//works just like 
ObjComboBoxColumn.Items.Add("blablabla"); 

Mais quand je commencé à planifier comment remplir ces comboboxes je l'ai remarqué: Il n'y a pas de propriété « Valeurs » dans ComboBoxDataColumn.

ObjComboBox.Values = whateverArray; 
//works, but the following doesn't 
ObjComboBoxColumn.Values = whateverArray; 

Questions: 0 -
Comment puis-je ses valeurs peuplent? (Je suppose que c'est aussi simple, mais utilise un autre nom)
1 - Si cela fonctionne comme une combobox, quelle est l'explication pour ne pas avoir cet attribut?


----- [EDIT] ------

J'ai vérifié la citation de Charles, et j'ai pensé que je devais changer ma façon de peupler ces mauvais garçons. Au lieu de boucler les chaînes et de les insérer une par une dans la liste déroulante, je devrais saisir les champs que je veux remplir dans une table, et définir une colonne de la table comme "valeur", et une autre comme "affichage" . Donc, je l'ai fait:

ObjComboBoxColumn.DataSource = DTConfig; //Double checked, guaranteed to be populated 

ObjComboBoxColumn.ValueMember = "Code"; 
ObjComboBoxColumn.DisplayMember = "Description"; 

Mais rien ne se passe, si j'utilise le même objet que si:

ObjComboBoxColumn.Items.Add ("StackOverflow");

Il est ajouté.

Il n'existe aucune fonction DataBind().

Il trouve les deux colonnes, et c'est garanti ("Code" et "Description") et si je change leur nom en nonexistant cela me donne une exception, donc c'est bon signe.


----- [EDIT] ------

J'ai une table dans SQL Server qui est quelque chose comme

Code | text
-----
1 | foo
2 | bar

Il est simple, et avec d'autres comboboxes (en dehors de gridviews) j'ai boucle avec succès peuplé à travers les lignes et en ajoutant les textes:

ObjComboBox.Items.Add(MyDataTable.Rows[I]["MyColumnName"].ToString()); 

et d'obtenir toutes les valeurs, en ajoutant dans un tableau, et comme le mettre:

ObjComboBox.Values = MyArray; 

Je voudrais remplir mes comboboxColumns tout aussi simplement que je fais avec comboboxes.

Répondre

3

Je ne veux pas paraître odieux, mais savez-vous qu'il existe de la documentation pour tout ça?

De http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxcolumn.aspx:

Vous pouvez compléter la liste déroulante colonne manuellement en ajoutant des valeurs aux Articles collection. Vous pouvez également lier la liste déroulante à sa propre source de données en définissant la propriété DataSource colonne . Si les valeurs sont objets dans une collection ou des enregistrements dans une table de base de données, vous devez également définir les propriétés DisplayMember et ValueMember . La propriété DisplayMember indique la propriété d'objet ou la colonne de base de données qui fournit les valeurs affichées dans la liste déroulante . La propriété ValueMember indique la propriété d'objet ou la colonne de base de données utilisée pour définir la propriété Value de la cellule .


EDIT:

À partir de votre édition, il semble que vous pourriez essayer d'utiliser les propriétés non publiques du type sous-jacent pour DisplayMember et/ou ValueMember. Ou si votre source de données combobox est un DataTable, assurez-vous qu'il a des colonnes "Code" et "Description".

Voici une démo simple. Je crée une liste de Foo et l'assigne en tant que DataSource de ma colonne de liste déroulante. Il suffit de créer une application WinForms et collez ce dans.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    }     

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     // this will be the datasource for the combo box column; you could also bind it to a dataset 
     List<Foo> foos = new List<Foo>() { 
      new Foo() { FooID = 0, FooName = "No Foo." }, 
      new Foo() { FooID = 1, FooName = "Foo Me Once" }, 
      new Foo() { FooID = 2, FooName = "Foo Me Twice" }, 
      new Foo() { FooID = 3, FooName = "Pity The Foo!" } 
     }; 

     DataGridView dataGridView1 = new DataGridView(); 
     dataGridView1.AutoGenerateColumns = false; 

     // add normal text column 
     DataGridViewColumn column = new DataGridViewTextBoxColumn(); 
     column.DataPropertyName = "MyText"; 
     column.Name = "Text"; 
     dataGridView1.Columns.Add(column); 

     // add the combo box column 
     DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn(); 
     comboCol.Name = "Foo"; 
     // bind it to the list of foos to populate it 
     comboCol.DataSource = foos; 
     // specify which property of the grid's datasource to bind 
     comboCol.DataPropertyName = "MyFoo"; 
     // specify the property of the combo's datasource to bind 
     comboCol.ValueMember = "FooID"; 
     // specify the property of the combo's datasource to display 
     comboCol.DisplayMember = "FooName"; 

     dataGridView1.Columns.Add(comboCol); 

     // add some data 
     BindingSource bindingSource1 = new BindingSource(); 
     bindingSource1.Add(new BusinessObject(1, "You say")); 
     bindingSource1.Add(new BusinessObject(2, "George says")); 
     bindingSource1.Add(new BusinessObject(3, "Mr. T says")); 
     bindingSource1.Add(new BusinessObject()); 
     dataGridView1.DataSource = bindingSource1; 

     Controls.Add(dataGridView1); 
     dataGridView1.Dock = DockStyle.Fill; 
    }   

    class Foo 
    { 
     public int FooID { get; set; } 
     public string FooName { get; set; }   
    } 

    class BusinessObject 
    { 
     public BusinessObject(int foo, string text) 
     { 
      MyFoo = foo; 
      MyText = text; 
     } 
     public BusinessObject() 
     { 
      MyFoo = 0; 
      MyText = ""; 
     }    
     public string MyText { get; set; } 
     public int MyFoo { get; set; } 
    } 
} 
+0

Vous ne sembles pas désagréable à all.Everyone connaît le framework .NET ainsi que C# sont bien documentés, et je ne veux pas paraître ingrate, mais Je calculerais qu'environ 60 mille des 81 mille questions sur C# provenaient de personnes qui ont lu la documentation, ne l'ont pas comprise, l'ont mal interprétée ou ne l'ont pas lue du tout. Je suis parmi ceux-là, j'en ai lu quelques-uns à ce sujet, mais je n'ai pas compris comment le faire facilement, j'ai vérifié sur S.O. et je n'ai pas trouvé de question à ce sujet, j'ai alors décidé de poser une question à ce sujet, et peut-être que d'autres personnes pourront le trouver à l'avenir, mais merci! – Marcelo

+0

@MarceloRamires: Vous avez probablement raison. La documentation que j'ai citée aide-t-elle? Il y a quelques exemples sur cette page aussi. Si vous êtes toujours confus, je pourrais vous donner un exemple plus simple. –

+0

Je serais heureux =) J'ai mis à jour ma question – Marcelo

Questions connexes