【问题标题】:DataGridViewComboboxCell display member not showing upDataGridViewComboboxCell 显示成员未显示
【发布时间】:2020-08-22 05:03:55
【问题描述】:

目标

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

当前问题

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

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

查看下面的结果。除了我的组合框单元之外的所有内容都已填充:

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

【问题讨论】:

    标签: vb.net winforms datagridview dataview datagridviewcomboboxcell


    【解决方案1】:

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

    例如,假设您有一个像这样的Handedness 表:

    标识名称 1 对 2 左 3 灵巧

    你有一个像这样的Person 表:

    Id 名称 HandednessId 1 彼得 2 2 保罗 1 3 玛丽 3

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

    更多信息请参见:

    Adding a ComboBox Column to a DataGridView

    【讨论】:

    • 感谢您的回复。我也看过你在 VBForums 上的回答。实际上,我确实在 DataGridViewComboboxCell 上设置了显示成员和值成员。它具有在 ValueMember 上设置为我指定的正确 ID 的正确值。但是它不显示显示成员。然而在 EdittedFormatValue 我可以看到它显示了正确的信息,但它没有出现在屏幕上
    【解决方案2】:

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

    • DataSource 设置为提供键/值查找的内容,例如具有两列 Disp 和 Val 的 SteelThicknesses 数据表,其行类似于 "Thick",1"Medium", 2"Thin", 3
    • DisplayMember 设置为查找表中包含要显示的文本的列名字符串,例如“Disp”,
    • ValueMember 设置为查找中的字符串列名,该列名具有与要显示的文本相关的值,例如“Val”和
    • DataPropertyName 设置为另一个表中具有要解码的值的属性(列)的名称(查找表的 Val 列中的值之一)(例如,具有 SteelThicknessID 列的 Products 表) .

    datagridview 绑定到 products 数据表,组合会找到例如3 在 steelthicknessid 列中,它将在 steelthicknesses 表的 Val 列中查找 3 并显示它在 steelthickesses 的该行的 Disp 列中找到的文本。如果用户通过删除组合列表并选择厚来更改显示的值,它将反向工作并从 Val 列中取 1,并使用 steelthicknessid 的新值 1 更新 products 表。如果您不希望这样,请将列或 datagridview 设为只读

    如需更深入的讨论,请参阅我在 DataGridView Loading From LINQ 中的回答

    【讨论】:

      【解决方案3】:

      这是一个奇怪的行为,但我发现将我的加载方法调用从 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 2014-07-12
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        相关资源
        最近更新 更多