0

我有一个多到一些与主要细节DataGrid设置混合。DataGridViewComboBoxColumn没有采取ValueMember

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

为了给你的视觉图像,有1大雇工DGV(DataGridView中),和3小根据雇员DGV选定行进行更新。

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

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

确切的错误(法语)是:

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

从System.String要InvInformatique.logiciels traducts为“无效的转换

代码

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 

回答

0

好了,所以,DataGridViews不喜欢使用的ToString()得到一个DisplayMember。当我将DisplayMember保留为空或使用我的Self属性时,它会错误显示ValueMember。

设置DisplayMember = "nom", ValueMember="Self"完美工作。

编辑

这也工作:

加入EF部分类:

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

变化列定义:

DisplayMember = "FormatedName", ValueMember = "Self"