我在工作中继承了一个相当大的项目,该项目未记录并用VB编写(最初在.NET之前启动,以.NET 2结束)。我正在更新/刷新大量代码,但遇到了一个烦人的问题,我还没有找到解决方案。该系统使用UI,Web服务和SQL DB。
问题:我有一个数据绑定组合框(最初设置为DropDownList - 我正在将它更改为DropDown,这就是开始这个混乱的东西 - 返回不是一个选项)来自Web服务的DataSet。当用户手动输入他们想要的项目时,来自文本字段的数据似乎不会将自身与DisplayMember关联,这会强制WS / SQL查询失败(当它期望ValueMember时会发送一个空值) 。如果用户输入部分选择,然后使用箭头键或选项卡从DisplayMember列表中选择他们想要的值,则查询会毫无问题地显示。
我的问题:如何将文本字段转换为DisplayMember,然后将其自身正确绑定到ValueMember,然后允许查询正确执行?很抱歉让这个声音变得复杂或复杂;我确信答案很简单,我只是把它涂上了它。
代码的相关位是:
With cmbDID
If dtsLU.Tables.Contains(reqTable) = True Then
.DataSource = dtsLU.Tables(reqTable)
.DisplayMember = "zip"
.ValueMember = "gridID"
End If
End With
cmbDID.DataBindings.Clear()
cmbDID.DataBindings.Add("SelectedValue", dtsData, strDT & ".gridID")
我已尝试将"SelectedValue"
更改为"Text"
,这几乎可以正常工作 - 但它直接转换为gridID
并跳过zip
,最终导致错误的Web服务响应由于zip
和gridID
字段值未同步(zip
(DisplayMember)可能为5123,而gridID
(ValueMember)可能为6047)。我已经尝试将"SelectedValue"
更改为"SelectedIndex"
,这让我无处可去。
非常感谢任何帮助。
修改 为了给流程添加一些说明,下面的伪代码/描述大致是发生了什么。我可以发布整个模块,但我觉得这会使整个问题更加混乱。
Private Sub A
FormAlpha is created with 1 ComboBox in the form of a DropDown
This DropDown is populated with a DataSet
DataBinding with a blank DataSet is added to the control to keep track of the users input
End Sub
用户在填充DropDown及其数据后,会在FormAlpha上触发lblSubmit_Click事件。 lblSubmit_Click调用Private Sub Submit
Private Sub Submit
BindingContext(DropDown DataSet, tableName).EndCurrentEdit() is called
DataSet.HasChanges() is processed
If changes are present, changes are processed
HERE存在问题
如果用户手动输入了DropDown字段,但未点击箭头键或标签,则DataSet会注册更改,但会在所有字段中返回空值 - 它知道输入的内容,但该数据显然没有不通过ComboBox的DataSet(ListItems或SelectedIndex没有改变/触发我猜)。如果用户使用箭头键选择项目,则DataSet具有正确的输入(我假设此时控件验证了数据)。
If the processed data is good, a value is entered into the database
If the processed data is bad (empty), an error is returned
End Sub
如果以上内容无法用我提供的内容解决,但有人仍然知道更好的方法来处理这种情况,我全都听见了。重写模块并不理想,但解决这个问题是必要的。
答案 0 :(得分:0)
好吧,虽然这个修复可能不太理想,但它仍然是一个修复。
简单问题是DropDown的文本值不会导致数据实际影响控件的SelectedIndex / SelectedValue,除非您使用箭头键或鼠标单击与它进行交互。因此,虽然DropDown会读到" 1234"但实际上控件看到了#34;"。
我为此做的修复只是在用户点击提交按钮时调用comboBox.text = comboBox.text
。