我有一个DataGridView,DataSource连接到对象。一切正常(我可以编辑那些对象并保持更改),直到我想选择使用组合框连接对象(在数据库中通过外键连接)。
我可以填充组合框,以便显示正确的值(即用户名)。我这样做是通过选择该特定列的数据源。它允许我选择显示的属性和值(但我不能将值设置为WHOLE选择的对象)。但是,在保存对象时,会发生错误。 DataGridView正在尝试保存所选对象的值(此“外部对象”的属性),而不是对象本身。
如何说服DataGridView保存所选对象而不仅仅是其中一个属性?
答案 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);
}
}