VB.NET中ComboBox的DisplayMember而非ValueMember存入数据库问题
解决ComboBox的DisplayMember存入数据库的问题
我明白你现在的需求了——之前查了ComboBox的DisplayMember和ValueMember相关资料,但没找到贴合你场景的方案。你有两张数据表:emp201(含empno、name、department等字段)和department_misc(含code、description字段),现在填充ComboBox后,想要把显示的部门名称(也就是DisplayMember)而非编码(ValueMember)存入emp201的department字段,对吧?
下面给你具体的实现步骤和修改后的代码:
1. 完善ComboBox的数据源绑定代码
首先先把你原来的Auto1方法补全,明确设置DisplayMember和ValueMember,确保数据源绑定正确:
Public Sub Auto1(ByVal cmb As ComboBox, ByVal strTbl As String) Dim locDa As New DataSet rs = cn.Execute("SELECT Code, Description FROM " & strTbl) locDaOle.Fill(locDa, rs, strTbl) ' 明确指定显示和值对应的字段 cmb.DisplayMember = "Description" ' 下拉框显示部门名称 cmb.ValueMember = "Code" ' 对应部门编码(这里我们最终不用它存库) cmb.DataSource = locDa.Tables(strTbl) ' 绑定数据源 End Sub
2. 存入数据库时获取DisplayMember的值
当你要把选中的部门名称存入emp201时,不要用cmb.SelectedValue(这个取到的是ValueMember对应的Code),而是从绑定的数据源里直接取Description字段——这是最可靠的方式,避免用户手动修改ComboBox文本导致的错误:
' 先获取选中项对应的DataRowView(因为ComboBox绑定的是DataTable) Dim selectedDeptRow As DataRowView = DirectCast(cmb.SelectedItem, DataRowView) ' 提取部门名称(也就是DisplayMember的值) Dim deptNameToSave As String = selectedDeptRow("Description").ToString() ' 执行插入/更新数据库的操作,这里用参数化查询避免SQL注入 Dim sql As String = "INSERT INTO emp201 (empno, name, department) VALUES (@empno, @name, @department)" Dim cmd As New OleDbCommand(sql, cn) cmd.Parameters.AddWithValue("@empno", "你的员工编号值") ' 替换成实际的员工编号输入控件值 cmd.Parameters.AddWithValue("@name", "你的员工姓名值") ' 替换成实际的员工姓名输入控件值 cmd.Parameters.AddWithValue("@department", deptNameToSave) ' 这里传入我们获取的部门名称 cmd.ExecuteNonQuery()
额外说明
如果你把ComboBox的DropDownStyle设置为DropDownList(用户不能手动输入文本,只能选择下拉项),那也可以直接用cmb.Text来获取显示的部门名称,但还是推荐从DataRowView里取值的方式——它直接来自绑定的数据源,逻辑更严谨,不会因为意外情况(比如控件样式修改)导致取值错误。
内容的提问来源于stack exchange,提问作者Christian Jay Castillo
相关产品推荐
相关产品推荐

