我有一个DataGridView(dgwList),我在其中加载了一组项目。这是一个中间形式,用户需要选择Action和Category,我为此创建了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的默认值时,我可以从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的Text属性,因为它显示为选定的文本。
我花了很多时间浏览论坛,但我发现没有任何与数据集相关的内容(Set selectedValue in DataGridViewComboBoxColumn除了缺少DataPropertyName)。一切都是关于用户在组合单元上引发的循环和事件。
我想避免错误并使用数据集(不循环修改每个单元格)来填充组合框的默认值。有什么想法吗?
答案 0 :(得分:0)
确定,
魔鬼在细节。我在数据库中将ID设置为 tinyint 数据类型,而当我尝试设置为2时,它被处理为 int32 。
我强制输入值到 int16 并在数据库中将ID设置为 smallint 然后它可以工作 - 我可以设置一个值:
ExpressionVisitor
所以我发现了问题,但它不符合我的问题的答案,因为它处理特定的单元格,而不是数据集。但是在SQL查询中添加CAST(.... as smallint)可以完全解决问题(结合将数据库中的ID设置为smallint):
Dim CBox As DataGridViewComboBoxCell = CType(Me.dgwList.Rows(2).Cells("Category"), DataGridViewComboBoxCell)
CBox.Value = CType(2, System.Int16) ' set value to 2