Выбор столбца из другой таблицы / объекта - PullRequest
1 голос
/ 10 августа 2009

У меня есть DataGridView, который DataSource связан с объектами. Все работает хорошо (я могу редактировать эти объекты, и изменение сохраняется), пока я не хочу выбирать, используя объект со списком, который связан с комбинированным списком (в базе данных он связан с внешним ключом).

Я могу заполнить поле со списком, чтобы отображались правильные значения (т. Е. Имя пользователя). Я делаю это, выбирая источник данных для этого конкретного столбца. Это позволяет мне выбрать отображаемые свойства, а также значение (но я не могу установить значение для всего выбранного объекта). Однако при сохранении объекта возникает ошибка. DataGridView пытается сохранить значение выбранного объекта (свойство этого «чужого объекта»), но не сам объект.

Как мне убедить DataGridView сохранить выбранный объект, а не только один из его свойств?

1 Ответ

1 голос
/ 24 октября 2009

Это одна из распространенных проблем. Вы не можете сделать это с оригинальным 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);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...