【问题标题】:DataGridViewComboBoxColumn not taking ValueMemberDataGridViewComboBoxColumn 不采用 ValueMember
【发布时间】:2012-09-20 15:19:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# winforms entity-framework entity-framework-4 datagridview


    【解决方案1】:

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

    设置DisplayMember = "nom", ValueMember="Self" 效果很好。

    编辑

    这也有效:

    添加到 EF 部分类:

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

    更改列定义:

    DisplayMember = "FormatedName", ValueMember = "Self"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多