多対多とマスター/詳細DataGridのセットアップが混在しています。
- 4 DataGridView
- 6つのエンティティ(2つのマッピングテーブル)
- 5データ関係
視覚的なイメージを提供するために、1つの大きなEmploye DGV(DataGridView)と、EmployeDGVが選択した行に応じて更新される3つの小さなものがあります。
3つの小さなグリッドの1つは、マッピングテーブルのない非常に単純な関係です。
ただし、他の2つは、マッピング先のエンティティのformatedinfoを使用するマッピングテーブルの行を表示します。.ToString()
これらの2つのDGVには、1つの列、つまり、マッピングが指している基になるオブジェクトを(すべき)フォーマットされた文字列(オーバーライド)を持つComboBoxしかありません(EFは、オブジェクト全体を受信するときに、それに応じてIDの設定を処理します)。ただし、新しい行を追加しようとすると、文字列をPut ObjectNameHereに変換できないと表示されます。これにより、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