如何访问ComboBox的ValueMember?绑定后获取comp_id失败求助
如何正确获取ComboBox绑定的ValueMember值?
我用以下代码绑定ComboBox:
private void getCompanydata() { MySqlConnection con = new MySqlConnection(ConfigurationManager.AppSettings["RL_InventoryConnection"]); if (con.State == ConnectionState.Closed) con.Open(); MySqlCommand cmd = new MySqlCommand("select comp_id, concat(comp_name,'-', comp_add) as company from companymaster;", con); MySqlDataAdapter sda = new MySqlDataAdapter(cmd); DataTable dt = new DataTable(); sda.Fill(dt); DataRow dr; dr = dt.NewRow(); dr.ItemArray = new object[] {0, "--Select Delivery Location--" }; dt.Rows.InsertAt(dr, 0); comboBox1.DisplayMember = "company"; comboBox1.ValueMember = "comp_id"; comboBox1.DataSource = dt; }
但在另一个方法里尝试获取绑定的comp_id(ValueMember)时无法生效:
private void SaveData() { string company = comboBox1.Text.ToString(); int companyid = Convert.ToInt32(comboBox1.SelectedValue); }
问题分析与解决方法
1. 核心问题:SelectedValue可能为空或类型转换失败
当ComboBox选中默认项(索引0)时,虽然你给comp_id赋值为0,但如果数据库中comp_id的类型与代码中转换的int不匹配,或者绑定过程中出现数据源同步问题,会导致SelectedValue无法正常转换。
2. 更稳定的取值方式:通过SelectedItem强转读取
直接将SelectedItem转换为DataRowView,然后读取对应列的值,这种方式不受绑定顺序或类型隐式转换的影响:
private void SaveData() { // 先判断是否选中了有效选项(跳过默认提示项) if (comboBox1.SelectedIndex > 0) { DataRowView selectedRow = (DataRowView)comboBox1.SelectedItem; int companyId = Convert.ToInt32(selectedRow["comp_id"]); string companyText = selectedRow["company"].ToString(); // 执行后续保存逻辑 } else { // 提示用户选择有效的配送地点 } }
3. 保留SelectedValue的优化写法
如果坚持使用SelectedValue,需要先做非空和类型校验,避免转换异常:
private void SaveData() { if (comboBox1.SelectedValue != null && int.TryParse(comboBox1.SelectedValue.ToString(), out int companyId)) { // 有效获取到companyId,执行逻辑 } else { // 处理未选择或无效值的情况 } }
4. 绑定代码的优化建议
添加using语句自动释放数据库连接,避免连接泄漏;同时调整绑定顺序(先设数据源,再设显示/值成员),减少潜在的绑定失效问题:
private void getCompanydata() { using (MySqlConnection con = new MySqlConnection(ConfigurationManager.AppSettings["RL_InventoryConnection"])) { if (con.State == ConnectionState.Closed) con.Open(); MySqlCommand cmd = new MySqlCommand("select comp_id, concat(comp_name,'-', comp_add) as company from companymaster;", con); MySqlDataAdapter sda = new MySqlDataAdapter(cmd); DataTable dt = new DataTable(); sda.Fill(dt); DataRow dr = dt.NewRow(); dr.ItemArray = new object[] {0, "--Select Delivery Location--" }; dt.Rows.InsertAt(dr, 0); comboBox1.DataSource = dt; comboBox1.DisplayMember = "company"; comboBox1.ValueMember = "comp_id"; } }
内容的提问来源于stack exchange,提问作者Mohd Sameer
相关产品推荐
相关产品推荐

