2015-10-30 57 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

作品完美的感謝 –

相關問題