WPF中DataTable返回null导致DataGrid无法展示ComboBox选中项对应数据
问题修复方案
问题1:ReadData方法逻辑缺陷导致返回null
你当前代码的核心问题是将参数赋值、DataTable初始化、数据填充的逻辑全部写在了if (db.State == ConnectionState.Closed)判断块内,只要连接初始状态不是关闭,这块代码完全不会执行,table未初始化就会返回null。同时你吞了所有异常,数据库连接错误、SQL语法错误、参数错误你完全感知不到,只会静默返回null。
修正后的ReadData代码:
public DataTable ReadData(User user) { // 方法内声明局部变量,避免全局变量的残留问题 DataTable table = new DataTable(); using (SqlConnection db = new SqlConnection(AppConnect.Connection)) { string query = "SELECT moduleCode,moduleName,modCredits,modHrsLeft FROM [Module] WHERE userName=@userName"; try { using (SqlCommand command = new SqlCommand(query, db)) { // SqlDataAdapter的Fill方法会自动开闭连接,不需要手动判断连接状态 command.Parameters.AddWithValue("@userName", user.UserName); SqlDataAdapter dataAdapter = new SqlDataAdapter(command); dataAdapter.Fill(table); } } catch (Exception e) { // 调试阶段可以在这里加断点看异常信息,不要只输出到控制台 Console.WriteLine(e.Message); // 可选:抛出异常方便上层感知错误 // throw; } // 不需要手动Close,using会自动释放连接 return table; } }
问题2:WPF DataGrid绑定错误
你给DataGrid.DataContext赋值DataTable是无效的,DataGrid需要绑定的是DataTable的默认视图。
修正后的调用代码:
private void BtnDisplay_Click(object sender, RoutedEventArgs e) { // 先判断选中项不为空,避免空引用异常 if (CmboxUserN.SelectedItem == null) return; // 如果你ComboBox绑定的是自定义对象,不要直接ToString,要取对应的属性值,比如((User)CmboxUserN.SelectedItem).UserName string userName = CmboxUserN.SelectedItem.ToString(); User user1 = new User { UserName = userName }; DataTable table = data.ReadData(user1); // 绑定到DefaultView,不要赋值给DataContext gridModules.ItemsSource = table.DefaultView; }
额外排查点
- 确认
AppConnect.Connection连接字符串配置正确,有权限访问目标数据库 - 确认
[Module]表中存在对应userName的测试数据 - 调试时查看传入的
user.UserName是否是你期望的用户名,避免ComboBox的SelectedItem.ToString()返回的是类名而非实际用户名
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

