4,816
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
''' <summary>
''' 强类型数据集,水晶报表“骨架”
''' </summary>
Private myDataSet As New DataSet1()
''' <summary>
''' “查看报表”按钮事件
''' </summary>
Private Sub btnShowReport_Click(sender As Object, e As EventArgs)
Dim DisplayColumnNum As Integer
If Not Integer.TryParse(comboBox1.Text, DisplayColumnNum) Then
'默认显示8列
DisplayColumnNum = 8
End If
'把要显示的列数以参数形式传给水晶报表
myReport.SetParameterValue("OptionNum", DisplayColumnNum)
DisplayColumnByN(DisplayColumnNum)
'这里尺寸控制是关键
crystalReportViewer1.ReportSource = myReport
End Sub
''' <summary>
''' 控制报表显示的列数及其尺寸控制
''' 无论显示多少列,控制所有列宽的总和保持一致
''' 【本方法也正是本文最最核心的片段】
''' </summary>
''' <param name="N">欲显示的列数</param>
Private Sub DisplayColumnByN(N As Integer)
'***************特 别 说 明************************************
' * 前面精确的模板设计至关重要,半点马虎不得,最终的效果都在此一举
' * 因为我们对每个对象加了左右边框,在水晶报表里面,‘单线’边框占
' * 40(di),勿忘了考虑这个宽度。
' * 在设计的时候,我把两个相邻对象之间的右边框和左边框“叠”在了一起,
' * 所以两个对象间只需考虑一个40,不用考虑2*40=80(di)单位的宽度
'由于列宽总和要保持一致,故需先获取总宽度
Dim tableWidth As Integer = 1353 * 8 + 7 * 40
'1353为对象宽度,40为边框宽度
'设置当前每一列的宽度,必须先减掉中间边框的宽度再均分
Dim columnWidth As Integer = (tableWidth - (N - 1) * 40) \ N
'标识 列序号
Dim columnOrder As Integer = 1
'遍历详细节的对象
For Each obj As ReportObject In DirectCast(myReport, CrystalReport1).Section3.ReportObjects
'列1的Left属性(105)保持不变
obj.Left = 105 + (columnWidth + 40) * (columnOrder - 1)
obj.Width = columnWidth
columnOrder += 1
Next
End Sub
''' <summary>
''' 全局水晶报表对象
''' </summary>
Private myReport As ReportDocument
''' <summary>
''' 窗体关闭后立即删除水晶报表产生的临时文件,避免过多临时文件从而导致“报表加载失败”
''' </summary>
Private Sub rptForm_FormClosing(sender As Object, e As FormClosingEventArgs)
myReport.Dispose()
End Sub
''' <summary>
''' 填充水晶报表“骨架”并为水晶报表设定数据源
''' </summary>
Private Sub rptForm_Load(sender As Object, e As EventArgs)
'往数据集“塞”测试数据
myDataSet.MultipleColTable.AddMultipleColTableRow("行一", "行一", "行一", "行一", "行一", "行一", _
"行一", "行一")
myDataSet.MultipleColTable.AddMultipleColTableRow("行二", "行二", "行二", "行二", "行二", "行二", _
"行二", "行二")
myDataSet.MultipleColTable.AddMultipleColTableRow("行三", "行三", "行三", "行三", "行三", "行三", _
"行三", "行三")
myDataSet.MultipleColTable.AddMultipleColTableRow("行四", "行四", "行四", "行四", "行四", "行四", _
"行四", "行四")
myDataSet.MultipleColTable.AddMultipleColTableRow("行五", "行五", "行五", "行五", "行五", "行五", _
"行五", "行五")
myReport = New CrystalReport1()
myReport.SetDataSource(myDataSet)
End Sub