【问题标题】:Datagridview - fill row from ComboboxDatagridview - 从组合框中填充行
【发布时间】:2016-11-28 09:44:13
【问题描述】:

我已将combobox 设置为在我的Datagridviewcolumn1 中可见。现在我正在尝试从Combobox_Key_Down 事件中填充出现组合框的Datagridview 的同一行。这是我显示组合框的代码:

Private Sub My_DGV_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles MY_DGV.CellMouseClick

 If e.RowIndex >= 0 Then

   With My_DGV
     If .Columns(.Rows(e.RowIndex).Cells(e.ColumnIndex).ColumnIndex).Name = "Column1" Then
        .CurrentCell = .Rows(.CurrentRow.Index).Cells(.CurrentCell.ColumnIndex)
        Show_Combobox(.CurrentRow.Index, .CurrentCell.ColumnIndex) 'function that shows my Combobox in that cells
        Combo.Visible = True

     Else
        Combo.Visible = False
     End If
   End With
 End If

End Sub

我尝试了很多东西,但我不知道如何确定 Combobox 出现在哪一行以及如何将 Datagridview 行赋予我的 Combobox 值。有人请给我一个线索,我该怎么做。提前致谢!

【问题讨论】:

  • 您的意思是所有行在column1 中都有一个combobox ,并且您想确定combobox 在哪一行展开?
  • 您还在为如何描绘/编辑 m:m 关联表而苦恼吗?
  • @Plutonix,是的:)。但我今天设法做了一些事情,我认为它可能真的有效。如果我做对了,明天我会发布答案。
  • @Mech_Engineer,是的。但我已经确定使用 .SelectedCells(0).RowIndex。我也用它填充了所有行。我现在只需要对更新数据集和数据库插入进行排序。我明天会发布一个答案,如果我会管理它。

标签: vb.net datagridview combobox


【解决方案1】:

您的方法的第一个问题是 DGV 只能有一个 DataSource:它可以显示 m:m 关联表相关元素。如果将其中一个表中的列包含在查询中以进行显示,则该表将变得不可更新,并且用户可能会感到困惑,为什么他们不能编辑他们可以看到的内容。他们用你描述的方式似乎没有什么价值,因为直到他们做出选择之后他们才能看到详细数据。

接下来,它需要另一个数据表来提供 CboColB 的详细信息。由于您希望 DGV 绑定到 DataTable 轻松更新,因此您最终不得不一遍又一遍地将数据插入单元格。

最后,考虑用户面临的问题。使用 Country 表(200 多个国家/地区,带有 ISO 代码和名称)和标志颜色列表,CountryFlagColors 表将有数百行(每个标志只有 2 种颜色)。

更好的显示方式可能是将m:m 表 (flagcolor) 过滤到选定的项目,以便用户只面对他们当前感兴趣的数据子集:

DGV 中使用的数据表是从 m:m 表构建的:

  • “国家/地区”列已隐藏。
  • 当他们从顶部的 CBO 中选择时,它用作 RowFilter 以将行限制为相关行。
  • RowValidating事件中,当国家单元格为DBNull时,将国家/地区组合中的SelectedValue复制到DGV单元格中填空
    • 我可能真的会让用户单击一个按钮并手动添加一行,这样我就可以播种国家/地区值而不是依赖于事件。
  • 它使用 DataAdapter 并在添加 X 个标志定义后,da.Update(dtFlagColors) 应用/保存所有更改。

好的,这样就提供了分配 N 种颜色选择来定义一个国家/地区的国旗颜色的核心功能。缺少的元素是 Color 项目的“详细信息”。

我在 Color 表中添加了一个无意义的 int 和 string 项,显示它们的一种方法是在 SQL 中创建一个包含重要细节的别名。将它们显示为离散元素可以使查询不可更新或邀请用户编辑他们无法在此处编辑的内容。我的傻 SQL:

"SELECT Id, Name, Concat(Name , ' (' , intItem , ' ' , stritem,')') As Info from FColor"

然后使用'Info'作为dgv中CBO列的显示成员:

dc = DirectCast(dgvCF.Columns(0), DataGridViewComboBoxColumn)
dc.DataSource = dtFlagColors
dc.DisplayMember = "info"
dc.ValueMember = "id"
dgvCF.DataSource = dtSample

combo 列当然有自己的数据源,为了显示一个东西,用另一个 for 作为 Value 回馈给你。结果(值很傻):

这并不完全是您想要的,但很接近并且更简单。它也几乎不需要代码来驱动关联实体。另一种选择是使用 DGV 作为第二个选择器,这样您就可以显示扩展数据并手动将行添加到 DGV:

如果您将下拉样式设置为“无”,则它看起来像一个文本列。

【讨论】:

  • 感谢您。我不确定我是否理解你写的所有内容......我认为我的问题很相似但仍然不同 - 在 m:m 表中,我有 ID_Table1、ID_Table2 和字段有效性。并且用户希望在 Table1 中的 Datagrid 3 字段中查看(我通过 ID_Table1 获得)+ 字段有效性,这基本上是 Datagrid 中唯一可以更改的字段。所以,我所做的是向用户显示相关表的一些数据,其中包含可以编辑的字段 Validity。所有其他字段都从 Combobox 填充,但它们只是绑定到数据集,我手动执行所有插入和更新。
  • i我放弃了这个,你说得对,不能像我计划的那样做。虽然我几乎让它工作 - 更新工作正常,也做插入。但是在我已经插入并想要更新一行之后,所有行都被更新了。我会尝试你的建议,用户需要接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多