DataGridViewComboBoxColumn没有采用ValueMember

时间:2012-09-20 15:19:53

标签: c# winforms entity-framework entity-framework-4 datagridview

我有一对多与一些Master-Detail DataGrid设置混合。

  • 4 DataGridView
  • 6个实体(2个映射表)
  • 5数据关系

为了给你一个可视图像,有一个大的Employe DGV(DataGridView)和3个较小的,根据Employe DGV选择的行进行更新。

3个较小网格中的一个是没有映射表的非常简单的关系。

然而,另外2个显示的映射表行使用它映射到的实体的formatedinfo。那2个DGV只有1列,一个带有格式化字符串的ComboBox(覆盖.ToString()),它应该具有映射所指向的底层对象(EF将在接收整个对象时处理相应的ID) 。但是,当我尝试添加新行时,它会说它无法将String转换为将对象名称放在此处。这让我想到如果你没有设置ValueMember,组合框将尝试使用.ToString()获取字符串表示。因此,我尝试通过向实体添加Self属性来绕过该行为,该实体只返回自己。没有成功,它仍然试图在某处转换字符串。

确切的错误(法语)是:

System.FormatException: Cast non valide de 'System.String' en 'InvInformatique.logiciels'.

引用“从System.String到InvInformatique.logiciels的无效转换。

代码

InventaireInformatiqueEntities iidb = new InventaireInformatiqueEntities();

bsEmployes.DataSource = iidb.employes;
bsMateriels.DataSource = iidb.materiels;
bsLogiciels.DataSource = iidb.logiciels;
bsLogicielEmployeMaps.DataSource = iidb.logiciel_employe_maps; // Needed to provoke the load query
bsAcces.DataSource = iidb.acces;
bsAccesEmployeMaps.DataSource = iidb.acces_employe_maps; // Needed to provoke the load query

dgvEmployes.AutoGenerateColumns = false;
dgvEmployes.Columns.AddRange(
    new DataGridViewTextBoxColumn { Name = "Nom", DataPropertyName = "nom" },
    new DataGridViewTextBoxColumn { Name = "Département", DataPropertyName = "departement" }
);
dgvEmployeMateriels.AutoGenerateColumns = false;
dgvEmployeMateriels.Columns.AddRange(
    new DataGridViewTextBoxColumn { HeaderText = "Nom", DataPropertyName = "nom" },
    new DataGridViewTextBoxColumn { HeaderText = "Satisfaction", Name = "satisfaction", DataPropertyName = "satisfaction" }
);
dgvEmployeAcces.AutoGenerateColumns = false;
dgvEmployeAcces.Columns.AddRange(
    new DataGridViewComboBoxColumn { HeaderText = "Accès", DataPropertyName = "acces", DataSource = bsAcces }
);
dgvEmployeLogiciel.AutoGenerateColumns = false;
dgvEmployeLogiciel.Columns.AddRange(
    new DataGridViewComboBoxColumn { HeaderText = "Logiciels", DataPropertyName = "logiciels", DataSource = bsLogiciels }
);

dgvEmployes.DataSource = bsEmployes;
dgvEmployeMateriels.DataBindings.Add(new Binding("DataSource", bsEmployes, "materiels"));
dgvEmployeLogiciel.DataBindings.Add(new Binding("DataSource", bsEmployes, "logiciel_employe_maps"));
dgvEmployeAcces.DataBindings.Add(new Binding("DataSource", bsEmployes, "acces_employe_maps"));

数据库

Employes
->id
->nom
->departement

Acces
->id
->nom
->description

Logiciel
->id
->nom

Materiel
->id
->employe_id
->nom
->description

Acces_Employe_Maps
->id
->acces_id
->employe_id

Logiciel_Employe_Maps
->id
->logiciel_id
->employe_id

数据库关系

Employes <-> Logiciel_Employe_Maps <-> Logiciels
Employes <-> Acces_Employe_Maps <-> Acces
Employes -> Materiel

1 个答案:

答案 0 :(得分:0)

好的,DataGridViews不喜欢使用ToString()来获取DisplayMember。当我将DisplayMember保持为空或使用我的Self属性时,它会消除ValueMember。

设置DisplayMember = "nom", ValueMember="Self"完美无缺。

修改

这也有效:

添加到EF分部类:

public string FormatedName { get { return this.ToString(); } }

列定义更改:

DisplayMember = "FormatedName", ValueMember = "Self"