Windows Forms发票管理应用:ComboBox联动TextBox显示价格求助
解决ComboBox选中项对应TextBox显示固定价格的问题
嘿,我来帮你搞定这个问题!先看看你现有代码里的几个明显问题:
- 你重复写了两次
ComboBox1_SelectedIndexChanged事件处理方法,这会直接导致编译错误,一个控件的同一个事件只能有一个处理方法哦。 - 第一个
Select Case的写法完全不符合VB.NET的语法,不能在Case后面的括号里直接赋值,得在分支块里写逻辑。
方案一:前端直接硬编码实现(快速简单)
先给你修正后的正确代码,逻辑清晰还不会报错:
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged ' 先判断有没有选中有效项,避免空值报错 If ComboBox1.SelectedItem Is Nothing Then TextBox1.Text = "" Return End If Dim selectedPrice As Integer ' 转成大写是为了避免大小写输入的问题,更健壮 Select Case ComboBox1.SelectedItem.ToString().ToUpper() Case "PRODU" selectedPrice = 45 Case "EVNT" ' 注意哦!你一开始给ComboBox加的是EVNT,不是EVENT,这里要完全对应上 selectedPrice = 50 Case "DISC" selectedPrice = 30 ' 这里可以填你给DISC设定的价格 Case Else selectedPrice = 0 ' 没有匹配到的话显示0,也可以改成空字符串 End Select TextBox1.Text = selectedPrice.ToString() End Sub
小提示:
- 一定要保证ComboBox里的项和代码里的字符串完全一致,比如你原来加的是
EVNT,如果代码里写EVENT就会匹配不到,这点很容易踩坑! - 加个空值判断能防止用户没选任何项的时候程序崩溃,新手写代码记得多考虑这种边界情况~
方案二:关联数据库实现(适合后续扩展)
既然你有SQL基础,如果你希望以后修改价格或者新增服务不用改代码,那用数据库存储对应关系会更灵活。比如先创建一个简单的表:
CREATE TABLE ServicePrices ( ServiceCode VARCHAR(5) PRIMARY KEY, -- 对应ComboBox里的PRODU/EVNT/DISC Price INT NOT NULL -- 对应的固定价格 ); -- 插入初始数据 INSERT INTO ServicePrices (ServiceCode, Price) VALUES ('PRODU', 45); INSERT INTO ServicePrices (ServiceCode, Price) VALUES ('EVNT', 50); INSERT INTO ServicePrices (ServiceCode, Price) VALUES ('DISC', 30);
然后在VB.NET里写代码从数据库查价格:
' 记得先在项目里引用System.Data.SqlClient(根据你的.NET版本,可能是Microsoft.Data.SqlClient) Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged If ComboBox1.SelectedItem Is Nothing Then TextBox1.Text = "" Return End If Dim serviceCode As String = ComboBox1.SelectedItem.ToString() Dim price As Integer = 0 ' 这里的连接字符串要改成你自己的数据库配置哦 Dim connStr As String = "Data Source=你的数据库服务器名;Initial Catalog=你的数据库名;Integrated Security=True;" ' Using语句会自动帮你释放资源,不用手动关连接,很省心 Using conn As New SqlConnection(connStr) Dim query As String = "SELECT Price FROM ServicePrices WHERE ServiceCode = @ServiceCode" Using cmd As New SqlCommand(query, conn) ' 用参数化查询防止SQL注入,这是好习惯 cmd.Parameters.AddWithValue("@ServiceCode", serviceCode) conn.Open() Dim result As Object = cmd.ExecuteScalar() If result IsNot Nothing Then price = Convert.ToInt32(result) End If End Using End Using TextBox1.Text = price.ToString() End Sub
数据库方案的好处:
- 以后要改价格或者加新的服务代码,直接在数据库里操作就行,不用改应用程序的代码,适合长期维护。
- 如果以后要扩展功能,比如加服务名称、备注之类的,数据库方案更容易扩展。
选哪种方案看你的需求啦,刚入门的话先试试第一种,快速看到效果,熟悉之后再用第二种更专业的方式~
内容的提问来源于stack exchange,提问作者Dimi D
相关产品推荐
相关产品推荐

