WPF DataGrid加载MySQL数据后显示空白行问题(C#)
排查WPF DataGrid显示空白行的问题
咱们来一步步拆解你代码里的问题,解决这个空白行的情况:
核心错误点
DataGrid列未设置绑定关系
你创建了DataGridTextColumn并设置了Header,但没告诉这个列要从行数据里读取哪个值——DataGrid根本不知道该显示什么,所以就算行里有数据也会空白。行数据的结构不合适
你用ObservableCollection<string>作为行项,这种字符串集合无法和手动创建的列对应起来。DataGrid的行项应该是包含对应列属性的对象(比如DataRowView或者自定义实体类),这样列才能通过绑定拿到对应的值。列索引从1开始,丢失第一列数据
循环里for (int i = 1; i < myReader.Columns.Count; i++)直接跳过了索引0的列,第一列的数据根本没加到行里,就算显示正常也会少一列内容。异常捕获类型错误
你用的是MySQL的驱动,对应的异常应该是MySqlException,而不是SqlException(那是SQL Server的异常类),之前的捕获逻辑其实抓不到MySQL的错误。
修正后的代码
推荐用DataTable来处理数据,WPF DataGrid和DataTable的适配性更好,代码也更简洁:
private void showSelectedTable(object sender, RoutedEventArgs e) { if (mysql.IsChecked == true) { // 先做非空判断,避免空引用异常 if(tableListBox.SelectedItem == null) return; string tableName = tableListBox.SelectedItem.ToString(); // 用反引号包裹表名,避免表名是MySQL关键字的情况 string query = $"SELECT * FROM `{tableName}`"; // 使用using自动释放资源,避免连接泄漏 using (MySqlCommand myTableContent = new MySqlCommand(query, (MySqlConnection)conn)) { try { DataTable dataTable = new DataTable(); MySqlDataAdapter adapter = new MySqlDataAdapter(myTableContent); // 直接把查询结果填充到DataTable里 adapter.Fill(dataTable); // 清空之前的列和数据,避免重复添加 tableDataGrid.Columns.Clear(); tableDataGrid.Items.Clear(); // 手动生成列(如果不需要DataGrid自动生成列,可以开启AutoGenerateColumns="False") foreach (DataColumn col in dataTable.Columns) { DataGridTextColumn textColumn = new DataGridTextColumn(); textColumn.Header = col.ColumnName; // 关键:设置绑定,绑定到DataRowView的对应列 textColumn.Binding = new Binding($"[{col.ColumnName}]"); tableDataGrid.Columns.Add(textColumn); } // 绑定数据源,DataTable.DefaultView是DataRowView的集合,完美适配DataGrid tableDataGrid.ItemsSource = dataTable.DefaultView; } catch (MySqlException ex) { MessageBox.Show($"查询出错:{ex.Message}"); } } } }
额外提示
- SQL注入风险:直接拼接表名存在SQL注入风险,建议提前验证表名是否合法,或者用数据库元数据获取可用表名,避免用户输入恶意内容。
- 自动生成列:如果你不需要手动控制列的样式,可以直接把
tableDataGrid.AutoGenerateColumns设为True,然后直接绑定ItemsSource = dataTable.DefaultView,DataGrid会自动创建列,代码会更简单。
内容的提问来源于stack exchange,提问作者Blvckhype
相关产品推荐
相关产品推荐

