C# WPF联动ComboBox问题:SelectionChanged首次取值异常
解决WPF ComboBox联动时首次选择值不正确的问题
问题根源
- 选中值获取时机错误:
TipoClass.Text的更新滞后于SelectionChanged事件触发时机,导致首次选择时拿到旧值,第二次才显示正确内容。 - SQL注入风险:直接拼接字符串构造SQL语句,存在安全隐患。
- 资源未正确释放:数据库连接未用
using语句管理,可能引发连接泄漏。 - 字段名不匹配:第二个ComboBox的
DisplayMemberPath设为DETTAGLIO,但查询语句返回字段是DETAILS,需确认数据库字段名一致性。
修复后的代码
1. 加载第一个ComboBox(优化资源管理)
public void load() { using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["dbx"].ConnectionString)) { string sql = "SELECT CLASSIFICATION FROM `classification`"; using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { conn.Open(); DataTable dt = new DataTable(); dt.Load(cmd.ExecuteReader()); TipoClass.ItemsSource = dt.DefaultView; } } }
2. 加载第二个ComboBox(参数化查询+资源管理)
public void loadOne(string classification) { using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["dbx"].ConnectionString)) { // 参数化查询避免SQL注入 string sql = "SELECT DETAILS FROM `details` WHERE CLASSIFICATION = @Classification"; using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Classification", classification); conn.Open(); DataTable dt = new DataTable(); dt.Load(cmd.ExecuteReader()); // 若数据库字段为DETTAGLIO,需修改SELECT语句为SELECT DETTAGLIO... DetailsClass.ItemsSource = dt.DefaultView; } } }
3. SelectionChanged事件处理(正确获取选中值)
private void SelectionChanged(object sender, SelectionChangedEventArgs e) { if (TipoClass.SelectedItem is DataRowView selectedRow) { // 直接从选中的DataRowView中读取字段值,避免Text属性更新滞后问题 string classification = selectedRow["CLASSIFICATION"].ToString(); loadOne(classification); } }
4. XAML代码(修正字段名匹配)
<ComboBox HorizontalAlignment="Left" Grid.Row="11" VerticalAlignment="Center" Width="350" Height="30" Margin="106,0,0,0" x:Name="TipoClass" DisplayMemberPath="CLASSIFICATION" SelectionChanged="SelectionChanged"/> <!-- 若查询返回字段为DETAILS,DisplayMemberPath需对应改成"DETAILS" --> <ComboBox HorizontalAlignment="Left" Grid.Row="12" VerticalAlignment="Center" Width="350" Height="30" Margin="106,0,0,0" x:Name="DetailsClass" DisplayMemberPath="DETAILS"/>
关键说明
- 通过
DataRowView获取选中项字段值,是最可靠的方式,彻底规避Text属性更新滞后的问题。 - 必须使用参数化查询,禁止直接拼接选中值到SQL语句中,杜绝注入风险。
using语句会自动释放数据库连接、命令等资源,避免内存泄漏。- 确保第二个ComboBox的
DisplayMemberPath与查询返回的字段名完全一致,否则下拉列表会显示空项。
内容的提问来源于stack exchange,提问作者sup3r93
相关产品推荐
相关产品推荐

