我有一对多与一些Master-Detail DataGrid设置混合。
为了给你一个可视图像,有一个大的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
答案 0 :(得分:0)
好的,DataGridViews不喜欢使用ToString()来获取DisplayMember。当我将DisplayMember保持为空或使用我的Self属性时,它会消除ValueMember。
设置DisplayMember = "nom", ValueMember="Self"
完美无缺。
修改强>
这也有效:
添加到EF分部类:
public string FormatedName { get { return this.ToString(); } }
列定义更改:
DisplayMember = "FormatedName", ValueMember = "Self"