在 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 ....;