DataGridViewComboboxCell 显示成员未显示

DataGridViewComboboxCell display member not showing up

目标

SteelTypes 的数据网格视图有一个列已绑定到数据视图 (SteelThicknesses)。我可以 select 数据并正确设置。但是我无法加载相同的信息。我的 datagridview comboboxcell 包含值和已编辑的格式化文本,但我无法设置显示成员信息。

当前问题

除组合框列外,我的所有文本框列都已正确加载。 cbCol 的变量设置正确,EditedFormattedValue 和 FormattedValue 包含我想要的值!但是,displayMember 不会复制到 datagridviewcombobox 单元格中。

我试图通过将其值设置为主键 (PK_SteelThickness) 来在 Épaisseur(厚度)列中显示“3”:

查看下面的结果。除了我的 comboboxcell 之外的所有内容都已填充:

提前感谢您的帮助,这让我抓狂:)

您没有设置文本。您设置基础 ID。这个想法是将列绑定到父级 table,并将网格绑定到子级 table,该子级具有指向该父级 table 的外键。您在网格单元格中设置外键值,并显示来自父级 table 的相应文本值。

举个例子,假设您有一个 Handedness table 像这样:

Id Name
 1 Right
 2 Left
 3 Ambidextrous

你有一个 Person table 像这样:

Id Name  HandednessId
 1 Peter            2
 2 Paul             1
 3 Mary             3

在您的网格中,您将创建一个 DataGridViewComboBoxColumn 并将其 DataPropertyName 属性 设置为 "HandednessId"。然后,当您将 Person table 绑定到网格时,HandednessId 列将绑定到组合框列。您可以将 Handedness table 绑定到该列,并将 DisplayMemberValueMember 分别设置为 "Name" 和 "Id"。然后网格将分别为 "Peter"、"Paul" 和 "Mary" 显示 "Left"、"Right" 和 "Ambidextrous"。如果你想让 Peter 灵巧,你可以将 HandednessId 单元格 Value 设置为 3 然后它会显示 "Ambidextrous".

有关详细信息,请参阅此内容:

Adding a ComboBox Column to a DataGridView

看来你在这里为自己做了很多工作。 Datagridcombobox 可用于解码值,只需使其

  • DataSource 设置为提供 key/value 查找的内容,例如 SteelThicknesses 数据table 具有两列 Disp 和 Val 并且具有 "Thick",1 "Medium", 2 "Thin", 3,
  • DisplayMember 设置为包含要显示的文本的查找 table 中的列名称的字符串,例如 "Disp"、
  • ValueMember 设置为查找中具有与要显示的文本相关的值的字符串列名称,例如 "Val" 和
  • DataPropertyName 设置为另一个 table 中具有要解码值的 属性(列)的名称(查找的 Val 列中的值之一 table)(例如带有 SteelThicknessID 列的产品 table)。

datagridview 绑定到产品数据table,组合将找到例如3 在 steelthicknessid 列中,它将在 steelthicknesses table 的 Val 列中查找 3 并显示它在 steelthickesses.if 的该行的 Disp 列中找到的文本 用户通过删除更改显示的值组合列表并选择 Thick,它将反向工作并从 Val 列中取 1 并使用 steelthicknessid 的新值 1 更新产品 table。如果您不想这样,请将列或数据网格视图设置为只读

有关更复杂的讨论,请参阅我在 DataGridView Loading From LINQ

中的回答

这是一个奇怪的行为,但我发现将我的加载方法调用从 new() 更改为 Load() 形式使其有效...

所以我改变了我的初始代码:

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    LoadSteelPlates()
    LoadPlateQuotes()
End Sub

为此:

Private Sub frmQuotePads_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    LoadSteelPlates()
    LoadPlateQuotes()
End Sub

这是唯一经过修改的代码,现在可以使用了。