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
相关产品推荐
相关产品推荐

