如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)

Posted

技术标签:

【中文标题】如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)【英文标题】:How To Add A DataGridViewComboBoxCell to a Bound DataGridView DataSource (Programatically) 【发布时间】:2014-03-02 04:58:05 【问题描述】:

目标

在使用 DataView 设置我的 DataGridView 的 DataSource 后,我想要一个 DataGridViewComboBoxCell。


现状

当用户浏览他的Bills 时,我有一个填充有BillDetails 的DataTable。

我创建了一个 DataView 并将 DataView 的 Table 设置为等于 Bill Details 的 DataTable。然后我将 DataGridView 的 DataSource 设置为 DataView。

设置 DataGridView 的数据源

Dim ViewContent As New DataView
ViewContent.Table = dsBillMat.Tables("dtBillDetails") 'Set the DataTable to my DataView's Table
ViewContent.RowFilter = "FK_BillHeader = '" & Bill.PK_BillHeader & "'" 'Filter the tables to get the correct Details for the corresponding Bill
dgvArticles.DataSource = ViewContent
FormatContentGridView() 'Formats the DataGridView Headers, Visible columns, etc.

FormatContentGridView

格式化我的 DataGridView 的代码。可能我需要在哪里为我的 ComboBoxCell 添加代码?

Private Sub FormatContentGridView()
    With dgvArticles
        'Hide columns
        .Columns("PK_BillDetail").Visible = False
        .Columns("FK_BillHeader").Visible = False

        'Header text
        .Columns("ILNum").HeaderText = "# IL"
        .Columns("ArtNum").HeaderText = "# Article"
        .Columns("Description").HeaderText = "Description"
        .Columns("PartNum").HeaderText = "# Pièce"
        .Columns("Quantity").HeaderText = "Qté."
        .Columns("Manufacturer").HeaderText = "Manufacturier"
        .Columns("ShippedLose").HeaderText = "Sép."
        .Columns("OnHand").HeaderText = "En Main"
        .Columns("RSPL").HeaderText = "RSPL"
        .Columns("Code").HeaderText = "Code"
        .Columns("Cost").HeaderText = "Coût ($)"

        'Widths
        .Columns("Description").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
        .Columns("Description").MinimumWidth = 150

        For Each c As DataGridViewColumn In dgvArticles.Columns
            If c.Visible And c.AutoSizeMode <> DataGridViewAutoSizeColumnMode.Fill Then
                c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
            End If
        Next

        'Display Index
        .Columns("ILNum").DisplayIndex = 0
        .Columns("ArtNum").DisplayIndex = 1
        .Columns("Description").DisplayIndex = 2
        .Columns("PartNum").DisplayIndex = 3
        .Columns("Quantity").DisplayIndex = 4
        .Columns("Manufacturer").DisplayIndex = 5
        .Columns("ShippedLose").DisplayIndex = 6
        .Columns("OnHand").DisplayIndex = 7
        .Columns("RSPL").DisplayIndex = 8
        .Columns("Code").DisplayIndex = 9
        .Columns("Cost").DisplayIndex = 10
    End With
End Sub

这很好用,信息已成功填充。我只是还没有我的 ComboBoxCell。


问题

我的问题是,我必须有一个 DataGridViewComboBoxCell 用于 Code 列(上面的红色矩形)。已使用 DataSource 的 DataView 创建列时,如何设置 DataGridViewComboBoxCell?

【问题讨论】:

【参考方案1】:

我不确定这是否是发布此内容的正确位置,但这里是。我有这个完全相同的代码,但是当我更新我的绑定源时,组合框的值不会保存到我的数据库中,直到我第二次输入值并运行我的保存代码

【讨论】:

你如何“更新你的绑定源”?通过什么事件导致 ComboBox 值在 DataGridView 中触发?找到后,您可以使用新值更新 DataTable。但是顺便说一句,我建议您删除您的答案,因为您可能会因发布问题/评论作为答案而被“标记”。我知道你没有足够的声誉来发表评论,但......不幸的是它是这样工作的:s【参考方案2】:

在设计视图中,右键单击 DataGridView 并选择编辑列。找到要调整的列,在 ColumnType 下,将其更改为 DataGridViewComboBoxColumn。然后您可以将 DataSource 和 DisplayMembers 设置为您需要的。

在运行时,您可以创建新列并隐藏上一列。

   Dim cboCode As New DataGridViewComboBoxColumn()
   cboCode.HeaderText = "Code"
   cboCode.DataPropertyName = "Code"
   cboCode.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet
   cboCode.Name = "cboCode"
   cboCode.DataSource = dtData
   cboCode.DisplayMember = "Code"
   cboCode.ToolTipText = "the code for this account , blah, blah, blah"
   dgvArticles.Columns.Add(cboCode )
   .Columns("Code").visible = False

【讨论】:

我的 DataGridView 没有关于设计时间的列。它们由 DataTable 的列填充。不幸的是,我不能这样做。 运行时解决方案见上文。我留下了设计时解决方案以防其他人需要它。 差不多了……但是如何将值应用于该列;如果在 FormatContentGridView 之前将 DataView 设置为 DataGridView 的 DataSource? (我将以下代码放在我的 FormatContentGridView 中) @Alex,基本上,通过将新列的 DataPropertyName 设置为您想要的基础数据源列。因此,从技术上讲,您现在有两列包含相同的数据;隐藏的文本字段和可见的组合框,两者都显示数据表中的“代码”列。 (并且两者都会随着任何一个字段的更改而更新)。

以上是关于如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据源绑定到 datagridview 组合框和复选框

将绑定的组合框添加到 datagridview

如何在不使用 datagridview 的情况下编辑绑定到组合框的数据表中的数据?

如何将每行具有不同组合框项的 DataTable 绑定到 DataGridView?

将组合框添加到 DataGridView 标题

Datagridview将Comboboxcolumns绑定到更改列表