You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid加载MySQL数据后显示空白行问题(C#)

排查WPF DataGrid显示空白行的问题

咱们来一步步拆解你代码里的问题,解决这个空白行的情况:

核心错误点

  1. DataGrid列未设置绑定关系
    你创建了DataGridTextColumn并设置了Header,但没告诉这个列要从行数据里读取哪个值——DataGrid根本不知道该显示什么,所以就算行里有数据也会空白。

  2. 行数据的结构不合适
    你用ObservableCollection<string>作为行项,这种字符串集合无法和手动创建的列对应起来。DataGrid的行项应该是包含对应列属性的对象(比如DataRowView或者自定义实体类),这样列才能通过绑定拿到对应的值。

  3. 列索引从1开始,丢失第一列数据
    循环里for (int i = 1; i < myReader.Columns.Count; i++)直接跳过了索引0的列,第一列的数据根本没加到行里,就算显示正常也会少一列内容。

  4. 异常捕获类型错误
    你用的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:53:48