这段代码为什么不行?

allIdover 2012-07-21 02:22:42
简单说明一下,DataGridView的数据设置为一个BingList<A> 类型,A中两个字段,我希望第二个字段从下拉列表中选择,
请看下面代码:


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; }
}
}

...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
allIdover 2012-07-23
  • 打赏
  • 举报
回复
结贴求回复
stiff_neck 2012-07-23
  • 打赏
  • 举报
回复
代码太长,你要把遇到的问题写出来,才好分析
allIdover 2012-07-21
  • 打赏
  • 举报
回复
求观摩~求大神
allIdover 2012-07-21
  • 打赏
  • 举报
回复

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);

关键是这段代码,有什么问题吗?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧