填充ComboBoxDataColumn项和值

时间:2010-05-18 19:41:47

标签: c# .net combobox

我有一个“填充组合框”,我很高兴我甚至开始使用更多的组合框。它通过引用将组合框对象与表中的“值集”(或任何您想要调用它)的ID一起使用,并添加项及其各自的值(不同)并完成工作。

我最近有一个在网格视图中使用组合框的绝妙主意,我很高兴地注意到它只使用一个组合框,但同时填充给定列中的所有组合框。

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

但是当我开始计划如何填充这些组合框时,我注意到:ComboBoxDataColumn中没有“Values”属性。

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

问题:
0 - 如何填充它的值? (我怀疑它一样简单,但使用其他名称)
1 - 如果它像组合框一样工作,那么没有这个属性的解释是什么?


- - - - [编辑] ------

所以我查看了Charles的引用,我认为我必须改变我填充这些坏男孩的方式。我没有循环遍历字符串并将它们一个一个地插入组合框中,而是应该抓住我想在表格中填充的字段,并将表格的一列设置为“值”,将另一列设置为“显示” 。所以我做到了这一点:

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

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

但是没有任何反应,如果我使用相同的对象:

ObjComboBoxColumn.Items.Add( “StackOverflow的”);

它被添加。

没有DataBind()函数。

它找到了两列,并且保证了这一列(“代码”和“描述”),如果我将它们的名称更改为不存在的列,它会给我一个例外,这是一个好兆头。


- - - - [编辑] ------

我在SQL Server中有一个类似

的表

代码|文字
-----
1 | FOO
2 |吧

这很简单,并且使用其他组合框(在网格视图之外)我已成功填充循环遍历行并添加文本:

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

获取每个值,将其添加到数组中,并将其设置为:

ObjComboBox.Values = MyArray;

我想像使用组合框一样简单地填充我的comboboxColumns。

1 个答案:

答案 0 :(得分:3)

我并不是说听起来很讨厌,但你知道所有这些东西都有文件吗?

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

  

您可以填充列下拉列表   通过向值添加值手动列出   商品集合。或者,你   可以将下拉列表绑定到自己的列表   通过设置列来设置数据源   DataSource属性。如果值是   集合中的对象或记录中的对象   一个数据库表,你还必须设置   DisplayMember和ValueMember   属性。 DisplayMember属性   指示哪个对象属性或   数据库列提供值   显示在下拉列表中   名单。 ValueMember属性   指示哪个对象属性或   数据库列用于设置   单元格值属性。


编辑:

从您的编辑中,您可能会尝试为DisplayMember和/或ValueMember使用基础类型的非公共属性。或者,如果您的组合框数据源是DataTable,请确保它具有“代码”和“描述”列。

这是一个简单的演示。我创建了一个Foo列表并将其指定为我的组合框列的DataSource。只需创建一个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; }
    }
}