DataGridView 级联/相关组合框列

2023-12-26

因此,我时常在 Winforms 的遗留应用程序中工作,并不总是熟悉绑定对象的最佳实践。基本上我有一个三部分集,其中有两个人,他们可能只有一种产品,但该产品可能会导致拥有不同的 SKU 集。有没有办法从第一个组合框的值触发组合框的事件和填充?我一直在环顾四周,我要么找到如何绑定组合框的基本数据(我可以做得很好),要么对如何绑定它做一些事情。触发依赖父项更改并更改数据集后不绑定。下面的例子:

POCOS:

Public Class Person
  Public Property PersonID As Integer
  Public Property FirstName As String
  Public Property LastName As String
  Public Property ProductId As Integer
  Public Property SkuId As Integer
End Class

Public Class Product
  Public Property ProductId As Integer
  Public Property Description As String
End Class

Public Class Sku
  Public Property SKUId As Integer
  Public Property ProductId As Integer
  Public Property Description As String
End Class

主要代码示例(基本 UI 实际上只有一个标记为“ds”的数据集,它与数据表中的 Person 和 Product POCOS 几乎相同地匹配。datagridview“dgv”,其列绑定到 Person 中的数据,除了名为 SKU 的列没有绑定之外因为我想在事后绑定它,而这正是我失败的地方。

更新于 2016 年 9 月 13 日我可以让下面的代码工作,除了在某些大型解决方案中(我这样做的全部原因)。它基本上不会执行将 cell() 转换为datagridviewcomboboxcell并忽略它并跳过该线。没有为什么,它只是跳过它。我想知道在较大的类中数据网格视图是否会损坏或发生其他情况。

主要代码:

Private _people As List(Of Person) = New List(Of Person)
Private _products As List(Of Product) = New List(Of Product)
Private _SKUs As List(Of Sku) = New List(Of Sku)
Private _initialLoadDone = False
Private _currentRow As Integer? = Nothing

Private Sub DynamicComboBoxDoubleFill_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    _products = New List(Of Product)({
                                     New Product With {.ProductId = 1, .Description = "Offline"},
                                     New Product With {.ProductId = 2, .Description = "Online"}
                                     })

    Dim s = ""
    For Each o In _products
      Dim row As DataRow = ds.Tables("tProducts").NewRow
      row("ProductId") = o.ProductId
      row("Description") = o.Description
      ds.Tables("tProducts").Rows.Add(row)
    Next

    _SKUs = New List(Of Sku)({
     New Sku With {.SKUId = 1, .ProductId = 1, .Description = "Mail"},
     New Sku With {.SKUId = 2, .ProductId = 1, .Description = "Magazine"},
     New Sku With {.SKUId = 3, .ProductId = 2, .Description = "Email"},
     New Sku With {.SKUId = 4, .ProductId = 2, .Description = "APIRequest"}
    })

    Dim items = _SKUs

    _people = New List(Of Person)({
      New Person With {.PersonID = 1, .FirstName = "Emily", .LastName = "X", .ProductId = 1, .SkuId = 1},
      New Person With {.PersonID = 2, .FirstName = "Brett", .LastName = "X", .ProductId = 2, .SkuId = 3}
                                  })
    For Each p In _people
      Dim row As DataRow = ds.Tables("tPeople").NewRow
      row("PersonId") = p.PersonId
      row("FirstName") = p.FirstName
      row("LastName") = p.LastName
      row("ProductId") = p.ProductId
      row("SkuId") = p.SkuId
      ds.Tables("tPeople").Rows.Add(row)
    Next

    For Each row As DataGridViewRow In dgv.Rows
      ArrangeValuesForSKUComboBox(row)
    Next

    _initialLoadDone = True
  End Sub

  Private Sub ArrangeValuesForSKUComboBox(row As DataGridViewRow)
    Dim productId = CInt(row.Cells("ProductId")?.Value)
    Dim skus = _SKUs.Where(Function(x) x.ProductId = productId).ToList().Select(Function(x) New With {Key .SkuId = x.SKUId, .SkuDesc = x.Description}).ToList()

    Dim cell = row.Cells("SKU")
    'Yeah I don't always work.  In this example I do, in others I won't.
    'For this reason I just want more ideas.  I don't care if you completely blow up how the binding is done and do something else entirely.
    Dim combobox = CType(cell, DataGridViewComboBoxCell)
    combobox.DataSource = skus
    combobox.ValueMember = "SKUId"
    combobox.DisplayMember = "SkuDesc"
    combobox.Value = skus.FirstOrDefault()?.SkuId
  End Sub

  Private Sub dgv_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged
    If _initialLoadDone Then
      Dim headerText As String = TryCast(sender, DataGridView).Columns(e.ColumnIndex).HeaderText
      If headerText = "PRODUCT" Then
        ArrangeValuesForSKUComboBox(dgv?.CurrentRow)
      End If
    End If
  End Sub

有依赖(级联或主/从)ComboBox中的列DataGridView,您可以按照以下步骤操作:

  1. Set DataSource从属列的所有可用值。

    Goal:这里的目标是防止首次加载时出现渲染错误,因此所有从属组合框都可以正确显示值。

  2. Hanlde EditingControlShowing网格事件并检查当前单元格是否为从组合单元格,然后使用以下命令获取编辑控件e.Control这是类型DataGridViewComboBoxEditingControl。然后检查主组合单元格的值并设置DataSource根据主组合单元格的值将控件编辑为合适的值子集的属性。如果主单元格的值为空,则将数据源设置为空。

    Goal:这里的目标是设置从属组合的数据源,以便在从从属组合中选择值时仅显示合适的值。

  3. Handle CellValueChanged并检查当前单元格是否为主组合,然后将从属单元格的值设置为空。
    Note:您可以根据主单元格值将其设置为第一个可用的有效值,而不是将从属单元格的值设置为空。

    Goal:这里的目标是防止主组合的值更改后从组合具有无效值,因此我们重置该值。

遵循上述规则,您可以根据需要拥有任意数量的依赖组合框。

Example

在下面的示例中,我有一个国家/地区(Id,名称)表,一个州(Id,名称,CountryId)表和一个人口(CountryId,StateId,人口)表。我想使用 2 个用于国家和州的组合列以及一个用于人口的文本列来执行人口表的数据输入。我知道这不是正常的数据库设计,但它只是在网格中具有主/从(依赖)组合框列的示例:

Private Sub EditingControlShowing(sender As Object, _
    e As DataGridViewEditingControlShowingEventArgs) _
    Handles PopulationDataGridView.EditingControlShowing

    Dim grid = DirectCast(sender, DataGridView)
    If (grid.CurrentCell.ColumnIndex = 1) Then 'State column
        Dim combo = DirectCast(e.Control, DataGridViewComboBoxEditingControl)
        If (grid.CurrentRow.Cells(0).Value IsNot DBNull.Value) Then
            Dim data = Me.DataSet1.State.AsDataView()
            data.RowFilter = "CountryId = " + grid.CurrentRow.Cells(0).Value.ToString()
            combo.DataSource = data
        Else
            combo.DataSource = Nothing
        End If
    End If
End Sub

Private Sub CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) _
    Handles PopulationDataGridView.CellValueChanged
    Dim grid = DirectCast(sender, DataGridView)
    If (e.ColumnIndex = 0 And e.RowIndex >= 0) Then 'Country Column
        grid.Rows(e.RowIndex).Cells(1).Value = DBNull.Value 'State Column 
    End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataGridView 级联/相关组合框列 的相关文章

  • 如何获取 TextRenderer 使用的确切文本边距

    System Windows Forms TextRenderer DrawText方法根据 的值呈现带或不带左右填充的格式化文本flags范围 TextFormatFlags NoPadding 将文本紧密地装入边界框 TextForma
  • 某些笔记本电脑中的 VB.net Forms UI 显示问题

    我是 VB 应用程序的新手 无法弄清楚我的应用程序出了什么问题 有一个带有几个标签和文本字段的表单 当我在我和其他人的机器上运行该应用程序时 它显示良好 并具有正确的对齐和字体 然而 对于某些人来说 应用程序表单 UI 是破碎的 未对齐的文
  • 将 PDF 嵌入到 WPF 应用程序中

    我正在尝试在 WPF 应用程序中嵌入 显示 PDF 到目前为止 我已经尝试过这些解决方案 但没有成功 在 a 中显示 PDFWindowsFormsHost主持一个AxAcroPdf控制 类似于显示的内容here http hugeonio
  • C# 的最佳替代“错误继续下一步”是什么?

    如果我为 C 代码放置空的 catch 块 它是否与 VB NET 的 On Error Resume Next 语句等效 try C code catch exception 我问这个问题的原因是因为我必须将 VB NET 代码转换为 C
  • 控件更改时 ObjectDataSource 创建两次

    我将 ObjectDataSource 与 GridView 一起使用 并在代码隐藏中使用 OnObjectCreated 处理程序 如果我以编程方式更改 GridView 上的子控件值 则整个控件会在同一请求中再次进行数据绑定 如 OnO
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • Vb中读取USB存储设备的序列号

    是否可以使用VB读取USB驱动器的序列号 这将为您提供 net 中驱动器的信息 包括 USB 设备 只需导入这些 导入脚本 导入系统 IO Private Class USBsn Private Sub Button1 Click ByVa
  • F# 之于 IronPython/IronRuby 就像 C# 之于 VB.NET 一样?

    我刚刚听了Chris Smith 谈论 F 的播客 http www code magazine com codecast index aspx messageid 7feb501f 25c8 432a 9624 97082f1e75e8他
  • 如何对数据集运行查询?

    我有一个DataSet named dsView包含数据 这是我用来读取 XML 的代码 dsView new DataSet dsView ReadXml c MyXml xml 该数据有一个名为MEN有字段Fname and Lname
  • 数字或货币的字符串格式?

    我需要为每个千给出逗号 所以我用了DataFormatString 0 它运行良好 但当值为0 它正在显示 00 我只想只显示 0 我们怎样才能做到这一点 DataFormatString 0 C0 这将格式化为小数点后 0 位的货币 Da
  • 如何使用c#/VB.NET在word中插入书签

    我正在尝试使用 C 在 Word 文档中添加书签 但它不起作用 而且我在 msdn 文档和互联网上都找不到任何帮助 这就是我正在尝试做的事情 我正在阅读 Word 文档 然后在该文档中搜索关键字 然后将该文本转换为超链接 效果很好 现在 我
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • 如何在 Binding Adapter 中将此 java 代码写入 kotlin

    我在 lang java 中的 onBindViewHolder 中编写了一些代码行 我试图在 Binding Adapter 中的 kotlin 中编写确切的代码 但我无法编写该代码 地震适配器 JAVA 我尝试过 但无法编写相同的代码来
  • WPF根据数据类型设置样式?

    问题就在这里 我将 TreeView 与几种不同类型的对象绑定 每个对象都是一个节点 有些对象有一个名为 IsNodeExpanded 的属性 当然 有些对象则没有 这是我的风格 现在 问题是当绑定不具有此属性的项目时 我们在输出中收到此错
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • 如何将行从一个 DataGridView 移动到另一个 DataGridView?

    我有两个具有相同列架构的 DataGridView 尽管两个不同的 DataView 作为数据源 如果这很重要 将行从一个数据网格视图移动到另一个数据网格视图的最佳 最快方法是什么 我相信如果您在 DataTable table1 中有一行
  • Scrollable Control中的Scroll/Scroll有什么用?

    ScrollableControl 类有 2 个受保护的布尔属性 HScroll 和 VScroll As the document https msdn microsoft com en us library system windows
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb

随机推荐

  • Windows 上 Ubuntu 上的 Bash 上的 pem 文件权限

    我尝试使用 pem 文件登录我的盒子 但收到错误消息 WARNING UNPROTECTED PRIVATE KEY FILE Permissions 0555 for arete server pem are too open It is
  • 如何让 Hibernate 调用我的自定义 typedef?

    我正在尝试定义 CompositeUserType 来处理 JPA Hibernate 应用程序中的特定类型 我有一个名为 ApplicationMessageType 的 CompositeUserType 旨在处理我的映射 根据我所读到
  • 将 PreBuiltTransportClient 与 elasticsearch 5 结合使用

    我正在尝试按照官方 Elasticsearch 5 文档来设置传输客户端 https www elastic co guide en elasticsearch client java api 5 0 transport client ht
  • PHP 和 Composer,如何组合composer.json 文件

    有人可以解释一下我应该如何将 Composer 与 php ini 一起使用吗 我的文档根目录中有一个composer json文件 它下载我的项目的核心包 但是当我想添加另一个项目 例如在这里找到的google php sdk 时http
  • [13]:Array 的未定义方法“assign_attributes”

    我的应用程序设置为 当 Product sold 属性为 1 时 表示商品已售出 并且不会显示在商店视图中 我正在尝试获取它 以便当客户签出时 购买商品时会更新product sold 属性 以下是我的控制器中应将 Product sold
  • 如何使用CSS在图像上添加覆盖颜色

    如果我有这样的图像 img src inshot1 jpg width 100px height 100px 悬停时我希望该块被某种颜色覆盖 例如 当您将鼠标悬停在其上时 您会看到一块具有相同高度和宽度的红色块 那么基本上是叠加吗 您可以通
  • 单个应用程序二进制文件如何支持 64 位和 32 位应用程序

    我们可以看到苹果的公告here https developer apple com news 根据这个文档 我们可以提交相同的二进制文件 支持 32 位和 64 位 我找到了一个堆栈溢出答案here https stackoverflow
  • 输入字段问题 - 关闭窗口但保持 Python 运行 [重复]

    这个问题在这里已经有答案了 有点长的问题 我正在创建一个输入字段 在 skrx 的主要帮助下 该字段显示在定制屏幕上 我已经对其进行了编程 以便当我按 Enter 键时 屏幕应该自行关闭 目前这个 pygame display quit 感
  • 如何在 TensorFlow 中有效地分配给张量的切片

    我想为 TensorFlow 2 x 中的一个模型中的输入张量切片分配一些值 我正在使用 2 2 但准备接受 2 1 的解决方案 我想做的一个非工作模板是 import tensorflow as tf from tensorflow ke
  • 如何调试通过 Windows Scheduler 运行的 exe? [复制]

    这个问题在这里已经有答案了 我正在使用 Windows Scheduler 来运行我编写的 exe 当调度程序启动我的 exe 时 如何跳入调试会话 更新1 我曾想过执行 Thread Sleep 然后附加到进程 当我尝试时 它说调试器已经
  • 加载 php 模块时出错

    我在 etc php 7 0 cli php ini 中添加了curl模块 extension usr lib php5 20121212 curl so 但是当我重新启动 php 时 我会 php m 我收到此错误 curl Unable
  • 如何在maven2中进行ear build?

    我对maven2很陌生 直到昨天我才成功地从maven2构建了war 我的下一个目标是为 war 文件构建 Ear 文件 其中还包括一些 jar 文件 你能帮忙吗 我将非常感激 问候 咬伤85 的官方文档Maven EAR 插件 http
  • msdeploy 的 Manifest.xml 文件中的 runCommand 提供程序

    我试图通过使用清单文件中的 runCommand 提供程序 通过 msdeploy 将运行批处理脚本 更多 前提是我能弄清楚 作为部署过程的一部分 这就是我的清单文件的样子
  • 如何加速 R 中的“expand.grid()”?

    我正在尝试加快创建包含两个向量之间所有可能组合的表 我们可以从以下位置获取此功能base R当我们使用expand grid 然而 我想知道我们是否可以使用以下工具实现相同的结果 但速度更快 collapse 包裹 StackOverflo
  • 在 PHPUnit (CIUnit) 中使用 YAML 文件作为数据提供者

    我正在使用 PHP CodeIgniter 框架编写一个应用程序 我正在尝试使用 CI Unit 扩展名为 PHPUnit 来测试应用程序 为了测试模型 我尝试加载 PHPUnit 文档中定义的 YAML 数据提供程序 但收到错误 如果我伪
  • Android Studio 不显示按钮的属性

    我在 Android Studio 中打开了一个空白的 Android 应用程序 当我尝试编辑按钮时 属性不存在 我是 Android 开发新手 正在遵循显示如何更改按钮中的文本的指南 但属性菜单缺少指南中看到的选项 Using 安卓工作室
  • API网关集成中使用代理集成有什么用?

    我正在尝试在 API Gateway API 和 VPC 背后的资源之间进行集成 创建集成时 有一个选项可供选择 使用代理集成 即使我没有选中此复选框并部署 API 我也可以通过 NLB 使 API 网关连接到 VPC 中的目标资源 所以
  • 在 php 中执行条件时出现问题[已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 press GET sell echo press OUTPUT IS SELL if press SELL header Loc
  • Android 共享首选项在删除文件后仍然可见

    我正在尝试使用共享首选项的应用程序 当我从中删除首选项文件时数据 data com your package name shared prefs mySharedPref xml手动使用 Android 监视器 应用程序仍然能够读取首选项值
  • DataGridView 级联/相关组合框列

    因此 我时常在 Winforms 的遗留应用程序中工作 并不总是熟悉绑定对象的最佳实践 基本上我有一个三部分集 其中有两个人 他们可能只有一种产品 但该产品可能会导致拥有不同的 SKU 集 有没有办法从第一个组合框的值触发组合框的事件和填充