VB.NET中DataGridView复选框行导出Crystal Report仅显示最后选中行求助
解决Crystal Report仅显示最后一条选中DataGridView记录的问题
嘿,我看你遇到了一个典型的筛选条件覆盖问题!你现在的代码每次循环都会直接替换SelectionFormula的值,导致之前选中行的条件被覆盖,最后报表只能显示最后一次循环的那条记录。咱们来一步步修复它:
问题根源
你的循环里每次找到选中行时,都执行了Frm_HasilOrder.crv_hasilorder.SelectionFormula = "...",这相当于把之前的筛选条件完全替换掉,而不是累加所有选中行的条件。最后自然只剩最后一条的筛选规则。
修复方案:收集所有选中行的筛选条件,再统一设置
我们需要先把所有选中行对应的筛选条件收集起来,用OR连接后再赋值给SelectionFormula,这样报表就会显示所有符合条件的记录。另外还要注意转义单引号(避免字段值含单引号时语法报错)、跳过DataGridView的空行:
' 初始化列表存储每个选中行的筛选条件 Dim selectedConditions As New List(Of String) For Each row As DataGridViewRow In dgv1.Rows ' 跳过DataGridView底部的空新行(如果开启了允许添加新行) If row.IsNewRow Then Continue For ' 检查当前行的复选框是否选中(列索引5是你的复选框列) Dim isChecked As Boolean = CBool(row.Cells(5).Value) If isChecked Then ' 从当前选中行获取需要筛选的字段值,这里替换成你实际的列名/索引 ' 注意:一定要转义单引号,避免SQL语法错误 Dim namaValue As String = row.Cells("nama").Value.ToString().Replace("'", "''") Dim kodeValue As String = row.Cells("kode").Value.ToString().Replace("'", "''") ' 把当前行的筛选条件添加到列表中 selectedConditions.Add($"{{tabelpasien.nama}}='{namaValue}' AND {{all_kodeprmtr.kode}}='{kodeValue}'") End If Next ' 拼接所有条件并设置给报表 If selectedConditions.Count > 0 Then ' 用OR连接所有选中行的条件,这样所有符合条件的记录都会被显示 Frm_HasilOrder.crv_hasilorder.SelectionFormula = String.Join(" OR ", selectedConditions) Else ' 没有选中行时的处理:设置一个永远不成立的条件,或者提示用户 Frm_HasilOrder.crv_hasilorder.SelectionFormula = "{tabelpasien.nama}='' AND 1=0" MessageBox.Show("请至少选择一条记录再生成报表!") End If
几个关键细节
- 避免条件覆盖:用
List(Of String)收集每个选中行的条件,最后统一拼接,而不是每次循环直接赋值。 - 转义单引号:如果字段值里包含单引号(比如用户名称是
O'Neil),直接拼接会导致Crystal Report的筛选语法报错,所以用Replace("'", "''")处理。 - 跳过空行:DataGridView默认会在底部显示一行空行用于添加新数据,需要用
row.IsNewRow跳过它,避免无效的筛选条件。 - 动态取行数据:你原来的代码里用了
txt_namaOrder.Text这个固定值,如果你需要的是选中行各自的nama值,一定要从当前行的单元格里取,而不是用文本框的固定值哦!
内容的提问来源于stack exchange,提问作者Winda Sari Elisabeth Siburian
相关产品推荐
相关产品推荐

