0

多対多とマスター/詳細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
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 に答える