【问题标题】:Get custom type back from DataGridViewComboBoxColumn从 DataGridViewComboBoxColumn 获取自定义类型
【发布时间】:2015-10-31 00:29:47
【问题描述】:

我的 DataGridView 中的 ComboBoxColumn 有问题。我用自己的类型列表填充 ComboBoxColumn 的 DataSource 并相应地设置 DataPropertyNameDisplayMemberValueMember。 问题是:当我选择不同的值并选择另一个单元格时出现异常,因为 long 类型的值无法转换回对象。

用于 DropDown 值的类:

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

我正在像这样填充 DropDown 和 Grid

        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;

将数据填充到网格视图中工作正常,但是当我选择不同的单位时,我得到以下异常:

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

【问题讨论】:

    标签: c# datagridview


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多