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

Visual C#从MySQL填充ComboBox失败,空白下拉框求排查

问题排查与解决方案

首先一眼就看到核心问题了:你把从数据库加载数据的代码写在了Game_List_SelectedIndexChanged事件处理方法里!这个事件只有当用户已经选中ComboBox里的某个选项时才会触发,但你的ComboBox一开始是空的,根本没有选项可以选,所以这段加载数据的代码永远不会被执行,自然ComboBox一直是空的。

接下来给你两种解决思路,从基础修复到优化实现:


基础修复:把数据加载移到窗体加载事件里

直接把数据加载逻辑移到Form2_Load中,这样窗体启动时就会自动拉取数据填充ComboBox:

using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Aliena_Store
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            LoadGameTitles(); // 调用加载数据的方法
        }

        // 把数据加载逻辑抽成独立方法,更清晰
        private void LoadGameTitles()
        {
            try
            {
                // 使用using语句自动释放连接、命令、阅读器资源,避免泄漏
                string connectionString = "server=localhost;user=root;database=Aliena_Store;port=3306;password=Blackie";
                using (MySqlConnection connection = new MySqlConnection(connectionString))
                {
                    string selectQuery = "SELECT Title, Price FROM Game_Details";
                    connection.Open();
                    using (MySqlCommand command = new MySqlCommand(selectQuery, connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            // 不用手动维护索引i,直接Add即可
                            while (reader.Read())
                            {
                                Game_List.Items.Add(reader.GetString("Title"));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载数据失败:{ex.Message}");
            }
        }

        private void Game_List_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 这里可以留着处理用户选中选项后的逻辑,比如同步显示对应的Price
        }

        private void Game_Quantity_TextChanged(object sender, EventArgs e)
        {
        }

        private void Game_Price_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
    }
}

优化实现:使用数据绑定关联Title和Price

如果你之后要实现选中Title后自动填充Price的功能,推荐用数据绑定的方式,这样可以同时保存Title和Price的关联关系,不用再单独查询:

using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Data;

namespace Aliena_Store
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            LoadGameData();
        }

        private void LoadGameData()
        {
            try
            {
                string connectionString = "server=localhost;user=root;database=Aliena_Store;port=3306;password=Blackie";
                using (MySqlConnection connection = new MySqlConnection(connectionString))
                {
                    string selectQuery = "SELECT Title, Price FROM Game_Details";
                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectQuery, connection);
                    DataTable gameTable = new DataTable();
                    adapter.Fill(gameTable);

                    // 绑定ComboBox:显示Title,实际值关联Price
                    Game_List.DisplayMember = "Title";
                    Game_List.ValueMember = "Price";
                    Game_List.DataSource = gameTable;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"加载数据失败:{ex.Message}");
            }
        }

        private void Game_List_SelectedIndexChanged(object sender, EventArgs e)
        {
            // 选中后直接获取对应的Price,填充到Game_Price控件
            if (Game_List.SelectedItem != null)
            {
                DataRowView selectedRow = (DataRowView)Game_List.SelectedItem;
                Game_Price.Text = selectedRow["Price"].ToString();
            }
        }

        private void Game_Quantity_TextChanged(object sender, EventArgs e)
        {
        }

        private void Game_Price_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
    }
}

额外注意事项

  • 确保你的数据库连接字符串正确,Aliena_Store数据库存在,Game_Details表有数据,并且root用户的密码正确。
  • 建议把数据库连接字符串放在配置文件里(比如app.config),不要硬编码在代码中,方便后续修改。
  • 测试时可以在加载数据的方法里加个断点,看看是否成功读取到数据,排查是否是数据库查询的问题。

内容的提问来源于stack exchange,提问作者Dusky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:13