我有一个“填充组合框”,我很高兴我甚至开始使用更多的组合框。它通过引用将组合框对象与表中的“值集”(或任何您想要调用它)的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。
答案 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; }
}
}