0

我有一个多对多与一些主从数据网格设置混合。

  • 4 数据网格视图
  • 6 个实体(2 个映射表)
  • 5 数据关系

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

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

然而,另外 2 个显示一个映射表行,它使用它映射到的实体的格式化信息。那些 2 DGV 只有 1 列,一个带有格式化字符串(覆盖.ToString())的 ComboBox,它(应该)具有映射指向的基础对象(EF 将在接收整个对象时相应地处理设置 ID)。但是,当我尝试添加新行时,它会说它无法将 String 转换为Put Object Name Here。这让我想到,如果您没有设置 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
4

1 回答 1

0

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

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

编辑

这也有效:

添加到 EF 部分类:

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

列定义的变化:

DisplayMember = "FormatedName", ValueMember = "Self"
于 2012-09-20T15:28:05.807 回答