使用C1ReportDesigner控件 > 步骤八:添加代码以创建或删除报告 |
通过使用DeleteReport 方法从列表中移除报表。该DeleteReport 方法简单地从报表列表移除选中的项目,从设计器控件清除Report属性,接下来如果该列表不为空,则进行新的选择。
添加以下代码以通过使用DeleteReport 方法移除报表:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
' 完成从列表中移除当前报表 Private Sub DeleteReport() ' 必须选中一个报表 Dim index As Integer = _list.SelectedIndex If (index < 0) Then Return '从设计器以及列表中移除报表 _c1rd.Report = Nothing _list.Items.RemoveAt(index) ' 如果可以,选择另一个报表 If (index > _list.Items.Count - 1) Then index = _list.Items.Count - 1 If (index > - 1) Then _list.SelectedIndex = index End If End If ' 完成 _dirty = True UpdateUI() End Sub |
C#
C# |
拷贝代码
|
---|---|
// 完成从列表中移除当前报表 private void DeleteReport() { // 必须选中一个报表 int index = _list.SelectedIndex; if (index < 0) return; //从设计器以及列表中移除报表 _c1rd.Report = null; _list.Items.RemoveAt(index); // 如果可以,选择另一个报表 if (index > _list.Items.Count-1) index = _list.Items.Count-1; if (index > -1) _list.SelectedIndex = index; // 完成 _dirty = true; UpdateUI(); } |
AddReport 则稍微复杂一点。在完整版本的报表设计器中,该命令调用一个向导,允许用户选择一个数据源,决定分组选项,布局以及样式。当实现您自己的设计器时,您可以原样使用该项带代码,或者自定义以满足需求。
和仅创建一个空白的新报表不同,该简单设计器将提示用户选择一个MDB文件,从中选择可以找到的第一个表,接下来选中前五个字段,并基于以上数据创建一个报表。
添加以下代码以通过AddReport方法创建一个报表:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Private Sub NewReport() ' 选择数据源(在这个示例只允许MDB文件) Dim dlg As New OpenFileDialog() dlg.FileName = "*.mdb" dlg.Title = "Select report data source" If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return ' 选择数据源中第一张表 Dim connString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", dlg.FileName) Dim tableName As String = GetFirstTable(connString) If tableName.Length = 0 Then MessageBox.Show("Failed to retrieve data from the selected source.") Return End If ' 新建报表 Dim rpt As New C1Report() rpt.ReportName = tableName ' 设置数据源 rpt.DataSource.ConnectionString = connString rpt.DataSource.RecordSource = tableName ' 添加title字段 Dim s As Section = rpt.Sections(SectionTypeEnum.Header) s.Visible = True s.Height = 600 Dim f As Field = s.Fields.Add("TitleField", tableName, 0, 0, 4000, 600) f.Font.Bold = True f.Font.Size = 24 f.ForeColor = Color.Navy ' 添加最多五个字段 Dim fieldNames As String() = rpt.DataSource.GetDBFieldList(True) Dim cnt As Integer = Math.Min(5, fieldNames.Length) '添加页眉 s = rpt.Sections(SectionTypeEnum.PageHeader) s.Visible = True s.Height = 400 Dim rc As New Rectangle(0, 0, 1000, s.Height) Dim i As Integer For i = 0 To cnt - 1 f = s.Fields.Add("TitleField", fieldNames(i), rc) f.Font.Bold = True rc.Offset(rc.Width, 0) Next '添加detail区域 s = rpt.Sections(SectionTypeEnum.Detail) s.Visible = True s.Height = 300 rc = New Rectangle(0, 0, 1000, s.Height) For i = 0 To cnt - 1 f = s.Fields.Add("TitleField", fieldNames(i), rc) f.Calculated = True rc.Offset(rc.Width, 0) Next ' 向列表添加新报表然后选中它 _list.Items.Add(New ReportHolder(rpt)) _list.SelectedIndex = _list.Items.Count - 1 ' 完成 _dirty = True UpdateUI() End Sub |
C#
C# |
拷贝代码
|
---|---|
private void NewReport() { // 选择数据源(在这个示例只允许MDB文件) OpenFileDialog dlg = new OpenFileDialog(); dlg.FileName = "*.mdb"; dlg.Title = "Select report data source"; if (dlg.ShowDialog() != DialogResult.OK) return; // 选择数据源中第一张表 string connString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", dlg.FileName); string tableName = GetFirstTable(connString); if (tableName == null || tableName.Length == 0) { MessageBox.Show("Failed to retrieve data from the selected source."); return; } // 新建报表 C1Report rpt = new C1Report(); rpt.ReportName = tableName; // 设置数据源 rpt.DataSource.ConnectionString = connString; rpt.DataSource.RecordSource = tableName; // 添加title字段 Section s = rpt.Sections[SectionTypeEnum.Header]; s.Visible = true; s.Height = 600; Field f = s.Fields.Add("TitleField", tableName, 0, 0, 4000, 600); f.Font.Bold = true; f.Font.Size = 24; f.ForeColor = Color.Navy; // 添加最多五个字段 string[] fieldNames = rpt.DataSource.GetDBFieldList(true); int cnt = Math.Min(5, fieldNames.Length); //添加页眉 s = rpt.Sections[SectionTypeEnum.PageHeader]; s.Visible = true; s.Height = 400; Rectangle rc = new Rectangle(0, 0, 1000, (int)s.Height); for (int i = 0; i < cnt; i++) { f = s.Fields.Add("TitleField", fieldNames[i], rc); f.Font.Bold = true; rc.Offset(rc.Width, 0); } //添加detail区域 s = rpt.Sections[SectionTypeEnum.Detail]; s.Visible = true; s.Height = 300; rc = new Rectangle(0, 0, 1000, (int)s.Height); for (int i = 0; i < cnt; i++) { f = s.Fields.Add("TitleField", fieldNames[i], rc); f.Calculated = true; rc.Offset(rc.Width, 0); } // 向列表添加新报表然后选中它 _list.Items.Add(new ReportHolder(rpt)); _list.SelectedIndex = _list.Items.Count-1; // 完成 _dirty = true; UpdateUI(); } |
以下代码使用一个辅助函数GetFirstTable打开一个连接,获取数据库架构,并返回其搜索到的第一个表。添加以下代码:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Private Function GetFirstTable(connString As String) As String Dim conn As New OleDbConnection(connString) Try ' 获取数据库架构 conn.Open() Dim dt As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing) Dim dr As DataRow For Each dr In dt.Rows ' 检查表类型 Dim type As String = dr("TABLE_TYPE").ToString().ToUpper() If (type <> "TABLE" AndAlso type <> "VIEW" AndAlso type <> "LINK" Then 'skip this one Else '获取表名 tableName = dr("TABLE_NAME").ToString() Exit For End If Next ' 完成 conn.Close() Catch End Try ' 返回找到的第一张表 Return tableName End Function |
C#
C# |
拷贝代码
|
---|---|
private string GetFirstTable(string connString) { string tableName = null; OleDbConnection conn = new OleDbConnection(connString); try { // 获取数据库架构 conn.Open(); DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); foreach (DataRow dr in dt.Rows) { // 检查表类型 string type = dr["TABLE_TYPE"].ToString().ToUpper(); if (type != "TABLE" && type != "VIEW" && type != "LINK") continue; //获取表名 tableName = dr["TABLE_NAME"].ToString(); break; } // 完成 conn.Close(); } catch {} // 返回找到的第一张表 return tableName; } |