2015-10-30 58 views
1

我遇到了DataGridView中的ComboBoxColumn问题。我使用自己的类型列表填充ComboBoxColumn的DataSource,并相应地设置DataPropertyName,DisplayMemberValueMember。 问题是:当我选择一个不同的值并选择另一个单元格时,我得到一个异常,因为long类型的值不能转换回该对象。从DataGridViewComboBoxColumn获取自定义类型

一个用于下拉的价值观类:

public class Unit 
{ 
    public long? ID { get; set;} 

    public string Name { get; set;} 

    public Unit(long id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 
} 

一个用于在DataGridView数据类:

public class Data 
{ 
    public long? Amount { get; set; } 

    public Unit ChosenUnit { get; set; } 

    public Data(long? amount, Unit unit) 
    { 
     Amount = amount; 
     ChosenUnit = unit; 
    } 
} 

我填充下拉列表和网格这样

 List<Unit> units = new List<Unit>(); 
     units.Add(new Unit(1, "grams")); 
     units.Add(new Unit(2, "kilograms")); 
     units.Add(new Unit(3, "tons")); 

     List<Data> data = new List<Data>(); 
     data.Add(new Data(200, units[0])); 
     data.Add(new Data(2, units[1])); 
     data.Add(new Data(1, units[2])); 

     gridData.AutoGenerateColumns = false; 

     gridData.Columns.Add("Amount", "Amount"); 
     gridData.Columns["Amount"].DataPropertyName = "Amount"; 

     DataGridViewComboBoxColumn cboColUnits = new DataGridViewComboBoxColumn(); 
     cboColUnits.Items.AddRange(units.ToArray()); 
     cboColUnits.HeaderText = "Unit"; 
     cboColUnits.DataPropertyName = "ChosenUnit"; 
     cboColUnits.DisplayMember = "Name"; 
     cboColUnits.ValueMember = "ID"; 
     cboColUnits.ValueType = typeof(long?); 

     gridData.Columns.Add(cboColUnits); 
     gridData.DataSource = data; 

填充数据插入到网格视图工作正常,但是当我选择diffent单元I出现以下情况例外:

exception

我能做些什么来解决这个问题?我是否需要实现某些事件处理程序或创建自定义编辑控件?

回答

1

将属性添加到Unit类作为自我引用 - 提示:也覆盖Equals方法。然后设置新的属性为您ValueMember

public class Unit 
{ 
    public long? ID { get; set; } 

    public string Name { get; set; } 

    public Unit Self { get { return this; } } 

    public Unit(long id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj != null && obj is Unit) 
     { 
      if ((obj as Unit).ID == this.ID && (obj as Unit).Name == this.Name) //* See Footnote 
      { 
       return true; 
      } 
     } 

     return base.Equals(obj); 
    } 
} 

*在你Equals覆盖的方法,不要忘记考虑到您的可空类型检查,这一点我没有为简码 - 但你的想法。


DataGridViewComboBoxColumn cboColUnits = new DataGridViewComboBoxColumn(); 
cboColUnits.Items.AddRange(units.ToArray()); 
cboColUnits.HeaderText = "Unit"; 
cboColUnits.DataPropertyName = "ChosenUnit"; 
cboColUnits.DisplayMember = "Name"; 
cboColUnits.ValueMember = "Self"; 
cboColUnits.ValueType = typeof(Unit); 
+0

作品完美的感谢 –

相关问题