110,534
社区成员
发帖
与我相关
我的任务
分享
namespace TestWinForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
BindingList<A> datasource = new BindingList<A>();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = datasource;
DataGridViewTextBoxColumn c = new DataGridViewTextBoxColumn();
dataGridView1.Columns.Add(c);
c.DataPropertyName = "FieldA";
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
listBox1.DataSource = dataGridView1.DataSource;
combo.Items.AddRange(
new Pack[] {
new Pack(){
Value= new B(){Field1="F10",Field2="F20"}
},
new Pack(){
Value= new B(){Field1="F11",Field2="F21"}
}
});
combo.DisplayMember = "Name";
combo.ValueMember = "Value";
combo.ValueType = typeof(B);
//如果注释掉下面这行,不会报错,但是值也当然不会设置到数据源中去
combo.DataPropertyName = "B";
dataGridView1.Columns.Add(combo);
dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
}
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
DataGridViewTextBoxCell tc = dataGridView1[e.ColumnIndex, e.RowIndex] as DataGridViewTextBoxCell;
Console.WriteLine(tc.Value.ToString());
}
else if (e.ColumnIndex == 1)
{
DataGridViewComboBoxCell bc = dataGridView1[e.ColumnIndex, e.RowIndex] as DataGridViewComboBoxCell;
Console.WriteLine(bc.Value.ToString());
}
Console.WriteLine();
Console.WriteLine("==dataGridView1.DataSource==Begin==");
BindingList<A> list = dataGridView1.DataSource as BindingList<A>;
foreach (A a in list)
{
Console.WriteLine(a);
}
Console.WriteLine("==dataGridView1.DataSource==End===");
}
}
public class A
{
public A()
{
B = new B() { Field1 = "default1", Field2 = "default2" };
}
public String FieldA { get; set; }
public B B { get; set; }
public override string ToString()
{
return FieldA + " " + B.ToString();
}
}
public class B
{
public String Field1 { get; set; }
public String Field2 { get; set; }
public override string ToString()
{
return Field1 + " " + Field2;
}
}
public class Pack
{
public String Name { get { return Value.Field1; } }
public B Value { get; set; }
}
}
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
listBox1.DataSource = dataGridView1.DataSource;
combo.Items.AddRange(
new Pack[] {
new Pack(){
Value= new B(){Field1="F10",Field2="F20"}
},
new Pack(){
Value= new B(){Field1="F11",Field2="F21"}
}
});
combo.DisplayMember = "Name";
combo.ValueMember = "Value";
combo.ValueType = typeof(B);
//如果注释掉下面这行,不会报错,但是值也当然不会设置到数据源中去
combo.DataPropertyName = "B";
dataGridView1.Columns.Add(combo);