2010-05-18 3 views
2

У меня есть «populate combobox», и я так счастлив, что даже начал использовать больше comboboxes. Он принимает объект combobox по ссылке с идентификатором «набора значений» (или того, что вы хотите назвать) из таблицы и добавляет элементы и их соответствующие значения (которые отличаются) и выполняет задание.Population ComboBoxDataColumn элементы и значения

Недавно я получил блестящую идею использования comboboxes в gridview, и я был рад заметить, что он работал JUST LIKE с одним списком, но одновременно заполнял все выпадающие списки в данном столбце.

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

Но когда я начал планировать, как заполнить эти выпадающие списки, я заметил: Там нет собственности «ценности» в ComboBoxDataColumn.

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

Вопросы:
0 - Как заполнить это ценности? (Я подозреваю, что это так же просто, но использует другое имя)
1 - Если он работает так же, как и с combobox, в чем объясняется отсутствие этого атрибута?


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

Так что я проверил цитату Чарльза, и я полагал, что я должен был изменить способ заполнения этих плохо мальчики. Вместо того, чтобы перебирать строки и вставлять их по одному в combobox, я должен захватить поля, которые я хочу заполнить в таблице, и установить один столбец таблицы как «значение», а другой - как «отображение», , Так что я сделал это:

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

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

Но ничего не происходит, если я использую один и тот же объект, как так:

ObjComboBoxColumn.Items.Add ("StackOverflow");

Добавлено.

Нет функции DataBind().

Он находит две колонки, и это гарантировано («Код» и «Описание»), и если я изменю их имена на несуществующие, это дает мне исключение, так что это хороший знак.


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

У меня есть таблица в SQL Server, который является чем-то вроде

код | текст
-----
1 | foo
2 | бар

Это просто, и с другим Наримером (за пределы GridViews) я уже успешно заселен циклом по строкам и добавление текстов:

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

И получать каждое значение, добавив его в массив, и устанавливая это нравится:

ObjComboBox.Values = MyArray; 

Я хотел бы, чтобы заполнить мои comboboxColumns так же просто, как я с Наримером.

ответ

3

Я не хочу звучать неприятно, но знаете ли вы, что есть документация для всего этого?

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

Вы можете заполнить столбец выпадающий список вручную путем добавления значения в Элементы коллекции. В качестве альтернативы вы можете связать раскрывающийся список с собственным источником данных , установив столбец Свойство DataSource. Если значения объектов в коллекции или записи в таблице таблицы базы данных, вы также должны установить объекты DisplayMember и ValueMember . Свойство DisplayMember указывает, какое свойство объекта или столбец базы данных содержит значения , которые отображаются в раскрывающемся списке . Свойство ValueMember указывает, какое свойство объекта или столбец базы данных используется для установки свойства ячейки .


EDIT:

С вашего редактирования, это звучит, как вы, возможно, пытается использовать непубличные свойства базового типа для DisplayMember и/или ValueMember. Или, если ваш источник данных combobox является DataTable, убедитесь, что он имеет столбцы «Код» и «Описание».

Описание: Простая демонстрация. Я создаю список Foo и назначаю его как DataSource столбца combobox. Просто создать приложение WinForms и вставьте в.

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

Вы не звучат оскорбительно в all.Everyone знает структуру .NET, а также C# сильно документированы, и я не хочу звучать неблагодарный, но я бы подсчитал, что около 60 тысяч из 81 тысячи вопросов о C# были у людей, которые прочитали документацию, не поняли ее, неправильно истолковали ее или вообще не прочитали. Я среди них, я кое-что прочитал об этом, но не понял, как это сделать, проверил на S.O. и не сомневался в этом, тогда я решил задать вопрос об этом, и, возможно, другие люди смогут найти его в будущем, но спасибо! – Marcelo

+0

@MarceloRamires: Вы, вероятно, правы. Помогает ли приведенная мной документация? На этой странице также есть несколько примеров. Если вы все еще смущены, я могу взломать для вас более простой пример. –

+0

Я был бы рад =) Я обновил свой вопрос – Marcelo