vb.net - 用 ComboBox 替换绑定的 DataGridView 列
问题描述
这篇 MSDN 文章建议可以使用您自己的数据更改自动生成的数据网格视图的内容并重新绑定其中一个列,从而更改类型。它并没有准确描述如何进行。有许多与此类似的问题,但其中大多数基本上指向 MSDN 资源,并且没有真正的指针如何准确地进行。最重要的是,尚不清楚要在自定义列中设置哪些属性以确保其工作方式与自动生成的列相同。这个问题详细说明了一个类似的问题,但这个例子根本不是很小。
假设我们有以下东西(作为一个最小的例子):
- 包含一些 N 列的数据库表。其中一列包含 3 个不同的值。假设它是一个整数列,可以包含 0、1 或 2。
- A
DataGridView
已绑定到所述数据库表作为数据源。
VB.NET 本身会生成一个textbox
列。由于这不是很用户友好,我想用一个 DataGridComboBoxColumn 替换它。怎么做呢?
解决方案
如本答案中所述,我设法创建了一个组合框列并使用以下示例数据填充它具有的“选项”(此处以 JSON 格式列出);
[{"id": 0, "type": "never"},
{"id": 1, "type": "always"},
{"id": 2, "type": "sometimes"}]
假设我们像这样绑定数据(myOptions 是一些帮助类,它返回上面的数据,作为两个类成员,id 和 type)。假设数据库表列名是'hasOption':
myDataGridView.Columns.Remove("hasOption")
Dim newColumn As New DataGridViewComboBoxColumn()
newColumn.DataSource = myOptions.GetChoices()
newColumn.DataPropertyName = "hasOption"
newColumn.ValueMember = "id"
newColumn.DisplayMember = "type"
newColumn.Name = "hasOption"
myDataGridView.Columns.Add(newColumn)
这里的重要事实是:
DataPropertyName必须与数据源列名(数据库表列名)完全匹配
ValueMember必须与包含组合框选项的值 (ID) 的列的名称相匹配。
DisplayMember必须与包含组合框选项的用户显示文本的列的名称相匹配。
当使用选项列表(手动数据,因此组合框选项不存储在数据库中,这些选项成员(id
和type
示例中)必须实现为属性。仅使用公共类成员会导致添加时出现奇怪的错误自定义列到DataGridView
.
value 成员类的实现如下:
Public Class myOptions
Public Property type As String
Public Property id As Integer
Public Sub New(ByVal nType As String, ByVal nID As Integer)
type = nType
id = nID
End Sub
Private Shared allValues As List(Of myOptions) = New List(Of myOptions) From {
New myOptions("never", 0),
New myOptions("always", 1),
New myOptions("sometimes", 2)
}
Public Shared Function GetChoices() As List(Of myOptions)
Return allValues
End Function
End Class
推荐阅读
- java - 在 espresso 测试中加载文件时权限被拒绝
- sql-server-2008 - NOT EXISTS 提高性能?
- spring-boot - spring.h2.console.settings.web-allow-others 不适合我禁用访问
- android - 使用 CountingIdlingResource 进行异步操作的仪器测试失败
- python - 在 Python 中绘制具有平滑外观的时间序列的导数
- python - 在 Python 烧瓶 API 中找不到文件
- selenium - 通过 Selenium WebDriver 和 JUnit 在 @AfterClass 注释方法中调用 driver.quit() 时出现 java.lang.NullPointerException
- node.js - 路由 express-sessions NodeJS 之间的持久会话
- java - 文本中的 JavaFx 文本字段
- qt - C1083:无法使用 cmake 和 qt 打开包含文件:“QPushButton”