You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:04:09