在 DatagridViewComboboxColumn 行中设置默认 SelectedValue 的数据集
Dataset to set default SelectedValue in DatagridViewComboboxColumn rows
我有一个 DataGridView (dgwList),我在其中加载了一组项目。这是一种中间形式,用户需要 select 操作和类别,为此我创建了 DataGridViewComboBoxColumns 并将它们设置在 Form_Load 事件中,如下所示:
dtCats = ds.Tables(0) ' Datatable with Categories
dtActions = ds.Tables(1) ' Datatable with Actions
Dim colCat As DataGridViewComboBoxColumn = Me.dgwList.Columns("Category")
Dim colActions As DataGridViewComboBoxColumn = Me.dgwList.Columns("Action")
colCat.ValueMember = "ID"
colCat.DisplayMember = "CategoryText"
colCat.DataSource = dtCats
colCat.DataPropertyName = "Category"
colActions.ValueMember = "ID"
colActions.DisplayMember = "Action"
colActions.DataSource = dtActions
colActions.DataPropertyName = "Action"
一切正常,当我加载没有默认值 Action 和 Category 的项目(使用另一个数据集)时,我可以 select 从 DropDownList 中获取它们。但是,当我加载第二个数据集(ds)并使用 "Action" 加载一个值作为默认 SelectedValue 时,如下所示:
Dim cmdtext As String = "SELECT ****, 2 as Action, *** WHERE ****; "
Dim ds As DataSet
ds = DAL.GetQueryResults(cmdtext) ' using own Data Access Layer to get dataSet
Me.dgwList.AutoGenerateColumns = False
Me.dgwList.DataSource = ds.Tables(0) ' load the data table
我收到“Datagridviewcomboboxcell 值无效”错误。它似乎试图将其加载为 DisplayMember,或者只是 DatGridViewComboBoxCell 的文本 属性,因为它显示为 selected 文本。
我花了很多时间浏览论坛,但没有发现任何与数据集相关的内容(除了 Set selectedValue in DataGridViewComboBoxColumn 缺少 DataPropertyName)。一切都是关于用户通过组合框单元格引发的循环和事件。
我想避免错误并使用数据集(不循环修改每个单元格)来填充组合框的默认值。有什么想法吗?
好的,
细节决定成败。我在数据库中将 ID 设置为 tinyint 数据类型,而当我尝试设置即 2 时,它被处理为 int32.
我强制输入值 int16 并在数据库中将 ID 设置为 smallint 然后它起作用了 - 我可以设置一个值:
Dim CBox As DataGridViewComboBoxCell = CType(Me.dgwList.Rows(2).Cells("Category"), DataGridViewComboBoxCell)
CBox.Value = CType(2, System.Int16) ' set value to 2
所以我发现了问题,但它不符合我的问题的答案,因为它处理的是特定的单元格,而不是数据集。但是将 CAST(.... as smallint) 添加到 SQL 查询完全解决了这个问题(结合将数据库中的 ID 设置为 smallint):
SELECT ...
CAST(CASE COL.Reason WHEN 'Service Fault' THEN 2 WHEN 'Program Fault' THEN 9 END as smallint) as Category
WHERE ... ORDER BY ....;
我有一个 DataGridView (dgwList),我在其中加载了一组项目。这是一种中间形式,用户需要 select 操作和类别,为此我创建了 DataGridViewComboBoxColumns 并将它们设置在 Form_Load 事件中,如下所示:
dtCats = ds.Tables(0) ' Datatable with Categories
dtActions = ds.Tables(1) ' Datatable with Actions
Dim colCat As DataGridViewComboBoxColumn = Me.dgwList.Columns("Category")
Dim colActions As DataGridViewComboBoxColumn = Me.dgwList.Columns("Action")
colCat.ValueMember = "ID"
colCat.DisplayMember = "CategoryText"
colCat.DataSource = dtCats
colCat.DataPropertyName = "Category"
colActions.ValueMember = "ID"
colActions.DisplayMember = "Action"
colActions.DataSource = dtActions
colActions.DataPropertyName = "Action"
一切正常,当我加载没有默认值 Action 和 Category 的项目(使用另一个数据集)时,我可以 select 从 DropDownList 中获取它们。但是,当我加载第二个数据集(ds)并使用 "Action" 加载一个值作为默认 SelectedValue 时,如下所示:
Dim cmdtext As String = "SELECT ****, 2 as Action, *** WHERE ****; "
Dim ds As DataSet
ds = DAL.GetQueryResults(cmdtext) ' using own Data Access Layer to get dataSet
Me.dgwList.AutoGenerateColumns = False
Me.dgwList.DataSource = ds.Tables(0) ' load the data table
我收到“Datagridviewcomboboxcell 值无效”错误。它似乎试图将其加载为 DisplayMember,或者只是 DatGridViewComboBoxCell 的文本 属性,因为它显示为 selected 文本。
我花了很多时间浏览论坛,但没有发现任何与数据集相关的内容(除了 Set selectedValue in DataGridViewComboBoxColumn 缺少 DataPropertyName)。一切都是关于用户通过组合框单元格引发的循环和事件。
我想避免错误并使用数据集(不循环修改每个单元格)来填充组合框的默认值。有什么想法吗?
好的,
细节决定成败。我在数据库中将 ID 设置为 tinyint 数据类型,而当我尝试设置即 2 时,它被处理为 int32.
我强制输入值 int16 并在数据库中将 ID 设置为 smallint 然后它起作用了 - 我可以设置一个值:
Dim CBox As DataGridViewComboBoxCell = CType(Me.dgwList.Rows(2).Cells("Category"), DataGridViewComboBoxCell)
CBox.Value = CType(2, System.Int16) ' set value to 2
所以我发现了问题,但它不符合我的问题的答案,因为它处理的是特定的单元格,而不是数据集。但是将 CAST(.... as smallint) 添加到 SQL 查询完全解决了这个问题(结合将数据库中的 ID 设置为 smallint):
SELECT ...
CAST(CASE COL.Reason WHEN 'Service Fault' THEN 2 WHEN 'Program Fault' THEN 9 END as smallint) as Category
WHERE ... ORDER BY ....;