Заполнение элементов и значений ComboBoxDataColumn - PullRequest
2 голосов
/ 18 мая 2010

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

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

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 - Если это работает так же, как выпадающий список, каково отсутствие этого атрибута?


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

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

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 | бар

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

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

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

ObjComboBox.Values = MyArray;

Я бы хотел заполнить свои списки со списком, так же просто, как я делаю со списком.

1 Ответ

3 голосов
/ 19 мая 2010

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

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

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


EDIT:

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

Вот простая демонстрация. Я создаю список Foo и назначаю его в качестве источника данных моего столбца со списком. Просто создайте приложение 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; }
    }
}
...