从其他表/对象中选择列

时间:2009-08-10 08:47:13

标签: c# datagridview combobox

我有一个DataGridView,DataSource连接到对象。一切正常(我可以编辑那些对象并保持更改),直到我想选择使用组合框连接对象(在数据库中通过外键连接)。

我可以填充组合框,以便显示正确的值(即用户名)。我这样做是通过选择该特定列的数据源。它允许我选择显示的属性和值(但我不能将值设置为WHOLE选择的对象)。但是,在保存对象时,会发生错误。 DataGridView正在尝试保存所选对象的值(此“外部对象”的属性),而不是对象本身。

如何说服DataGridView保存所选对象而不仅仅是其中一个属性?

1 个答案:

答案 0 :(得分:1)

这是常见问题之一。您无法使用原始DataGridViewComboboxColumn执行此操作。我前段时间找到了一个解决方案 - 你必须将它子类化。这是代码:

   public class DataGridViewBusinessComboBoxColumn : DataGridViewComboBoxColumn
    {
        public DataGridViewBusinessComboBoxColumn()
        {
            CellTemplate = new DataGridViewBusinessComboBoxCell();
        }
    }

    public class DataGridViewBusinessComboBoxCell : DataGridViewComboBoxCell
    {
        private System.ComponentModel.PropertyDescriptor displayProp;

        private CurrencyManager ListManager
        {
            get
            {
                BindingMemberInfo bmi = new BindingMemberInfo(base.DisplayMember);
                if (DataGridView != null)
                {
                    return (CurrencyManager)
                           DataGridView.BindingContext[DataSource, bmi.BindingPath];
                }
                return null;
            }
        }

        private System.ComponentModel.PropertyDescriptor DisplayProp
        {
            get
            {
                if (displayProp == null)
                {
                    displayProp = ListManager.GetItemProperties().Find(DisplayMember,
                                                                       true);
                }
                return displayProp;
            }
        }

        protected override object GetFormattedValue(object value, int rowIndex,
                                                    ref DataGridViewCellStyle cellStyle,
                                                    TypeConverter valueTypeConverter,
                                                    TypeConverter formattedValueTypeConverter,
                                                    DataGridViewDataErrorContexts
                                                        context)
        {
            if (value == null || value == cellStyle.DataSourceNullValue)
                return "";

            return base.GetFormattedValue(DisplayProp.GetValue(value),
                                          rowIndex, ref cellStyle, valueTypeConverter,
                                          formattedValueTypeConverter, context);
        }

        public override object ParseFormattedValue(object formattedValue,
                                                   DataGridViewCellStyle cellStyle,
                                                   TypeConverter formattedValueTypeConverter,
                                                   TypeConverter valueTypeConverter)
        {
            foreach (object item in ListManager.List)
            {
                if ((string) DisplayProp.GetValue(item) == (string) formattedValue)
                    return item;
            }

            return base.ParseFormattedValue(formattedValue, cellStyle,
                                            formattedValueTypeConverter, valueTypeConverter);
        }
}