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

一键获取GridControl所有数据及循环逐行读取记录生成报表方法

嘿,我来帮你搞定这两个功能!咱们先拆解需求,一步步来实现:

1. 一键获取GridControl中的全部数据

获取GridControl数据的方式分两种,取决于你是否给它绑定了数据源:

  • 如果已经绑定了DataTable或者自定义实体列表(比如List<YourModel>),直接拿绑定的数据源是最高效的:
// 假设GridControl绑定的是DataTable
DataTable gridFullData = gridControl.ItemsSource as DataTable;

// 如果绑定的是自定义实体类的列表
List<YourBusinessModel> gridDataList = gridControl.ItemsSource as List<YourBusinessModel>;
  • 如果没有绑定数据源,需要手动遍历GridControl的行和列来收集数据:
DataTable dt = new DataTable();

// 先根据GridControl的列创建DataTable的列
foreach (GridColumn col in gridControl.Columns)
{
    dt.Columns.Add(col.FieldName);
}

// 遍历每一行,把单元格数据填充到DataTable
foreach (var gridRow in gridControl.Items)
{
    DataRow newRow = dt.NewRow();
    foreach (GridColumn col in gridControl.Columns)
    {
        newRow[col.FieldName] = gridControl.GetCellValue(gridRow, col);
    }
    dt.Rows.Add(newRow);
}
// dt里就是GridControl的全部数据了
2. 循环读取记录生成每行报表

首先得提醒你:你的原代码直接拼接SQL字符串有严重的SQL注入风险,一定要用参数化查询!下面是完善后的代码,同时实现循环生成报表的逻辑:

private void btnin_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 用using语句自动释放数据库连接等资源,避免内存泄漏
        using (SqlConnection cnn = new SqlConnection("你的数据库连接字符串"))
        {
            cnn.Open();
            // 参数化查询,把用户输入作为参数传递,杜绝SQL注入
            string query = "SELECT * FROM viewdata1 WHERE Customers = @CustomerName";
            SqlCommand cmd = new SqlCommand(query, cnn);
            cmd.Parameters.AddWithValue("@CustomerName", cbbcustomer.Text);
            
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dataTable = new DataTable();
            da.Fill(dataTable);
            
            // 循环每一行数据,为每行生成报表
            foreach (DataRow row in dataTable.Rows)
            {
                // 调用你的报表生成方法,把当前行的数据传进去
                GenerateSingleReport(row);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作出错:{ex.Message}");
    }
}

// 自定义的报表生成方法,根据传入的行数据生成报表
private void GenerateSingleReport(DataRow dataRow)
{
    // 这里写你实际的报表生成逻辑,比如:
    // 1. 获取当前行的字段值
    string customer = dataRow["Customers"].ToString();
    string orderId = dataRow["OrderID"].ToString(); // 假设表中有这个字段
    // 2. 填充报表模板(比如RDLC、水晶报表)
    // 3. 导出报表为PDF/Excel或者直接打印
    Console.WriteLine($"正在为客户【{customer}】的订单【{orderId}】生成报表...");
}

如果不想从数据库重新查询,而是直接用GridControl里的数据生成报表,那就直接用第一个功能里拿到的DataTable来循环:

// 假设已经拿到了GridControl的全部数据dt
foreach (DataRow row in dt.Rows)
{
    GenerateSingleReport(row);
}

内容的提问来源于stack exchange,提问作者j.doen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:47:14