一键获取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
相关产品推荐
相关产品推荐

