使用C1ReportDesigner控件 > 步骤六:实现文件操作方法 |
该简单的设计器具有三个支持文件操作的命令:New,Open,以及Save。NewFile将清除类的变量,报表列表,预览以及设计器控件,并更新界面。
将下面的代码添加到NewFile的方法实现:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Private Sub NewFile() _fileName = "" _dirty = False _list.Items.Clear() _c1ppv.Document = Nothing _c1rd.Report = Nothing UpdateUI() End Sub |
C#
C# |
拷贝代码
|
---|---|
private void NewFile() { _fileName = ""; _dirty = false; _list.Items.Clear(); _c1ppv.Document = null; _c1rd.Report = null; UpdateUI(); } |
OpenFile提示用户选择打开一个报表定义文件,并使用C1Report组件获取选中的文件中的报表名称列表。每个报表加载到一个新的C1Report控件,并添加到报表列表(_list控件)。
该代码使用了一个ReportHolder 的封装类,而不是直接地将C1Report 组件添加到列表框中。ReportHolder 类的唯一功能是重写了ToString方法,因此列表框可以显示报表名称。
将下面的代码添加到OpenFile的方法实现:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Public Sub OpenFile() ' 获取打开文件的名称 Dim dlg As New OpenFileDialog dlg.FileName = "*.xml" dlg.Title = "Open Report Definition File" If dlg.ShowDialog() <> DialogResult.OK Then Return End If ' 检查所选的文件 Try reports = _c1r.GetReportInfo(dlg.FileName) Catch If IsNothing(reports) OrElse reports.Length = 0 Then MessageBox.Show("Invalid (or empty) report definition file") Return End If End Try ' 清除列表 NewFile() ' 加载新的文件 Cursor = Cursors.WaitCursor _fileName = dlg.FileName Dim reportName As String For Each reportName In reports Dim rpt As New C1Report() rpt.Load(_fileName, reportName) _list.Items.Add(New ReportHolder(rpt)) Next Cursor = Cursors.Default ' 选择第一个报表 _list.SelectedIndex = 0 End Sub ' ReportHolder ' 用作在列表框中保存报表的辅助类 ' 它所做的主要的事情就是复写了ToString()方法,以呈现报表名称 Public Class ReportHolder Public Sub New(ByVal report As C1Report) Me.Report = report End Sub Public Overrides Function ToString() As String Dim text As String = Me.Report.ReportName If text.Length = 0 Then text = "Unnamed Report" Return text End Function Public ReadOnly Report As C1Report End Class |
C#
C# |
拷贝代码
|
---|---|
public void OpenFile() { // 获取打开文件的名称 OpenFileDialog dlg = new OpenFileDialog(); dlg.FileName = "*.xml"; dlg.Title = "Open Report Definition File"; if (dlg.ShowDialog() != DialogResult.OK) return; // 检查所选的文件 string[] reports = null; try { reports = _c1r.GetReportInfo(dlg.FileName); } catch {} if (reports == null || reports.Length == 0) { MessageBox.Show("Invalid (or empty) report definition file"); return; } // 清除列表 NewFile(); // 加载新的文件 Cursor = Cursors.WaitCursor; _fileName = dlg.FileName; foreach (string reportName in reports) { C1Report rpt = new C1Report(); rpt.Load(_fileName, reportName); _list.Items.Add(new ReportHolder(rpt)); } Cursor = Cursors.Default; // 选择第一个报表 _list.SelectedIndex = 0; } // ReportHolder // 用作在列表框中保存报表的辅助类 // 它所做的主要的事情就是复写了ToString()方法,以呈现报表名称 public class ReportHolder { public readonly C1Report Report; public ReportHolder(C1Report report) { Report = report; } override public string ToString() { string s = Report.ReportName; return (s != null && s.Length > 0)? s: "Unnamed Report"; } } |
最后,SaveFile方法提示用户选择一个文件名,并使用一个XmlWriter将每一个报表通过C1Report.Save方法保存到一个新文件。将下面的代码添加到SaveFile 的方法实现:
Visual Basic
Visual Basic |
拷贝代码
|
---|---|
Public Sub SaveFile() ' 获取打开文件的名称 Dim dlg As New SaveFileDialog() dlg.FileName = _fileName dlg.Title = "Save Report Definition File" If dlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then Return ' 保存文件 Dim w As New XmlTextWriter(dlg.FileName, System.Text.Encoding.Default) w.Formatting = Formatting.Indented w.Indentation = 2 w.WriteStartDocument() ' 写入所有报表 Cursor = Cursors.WaitCursor w.WriteStartElement("Reports") Dim rh As ReportHolder For Each rh In _list.Items rh.Report.Save(w) 'rh.Report.ReportName Next w.WriteEndElement() Cursor = Cursors.Default ' 关闭文件 w.Close() ' 完成 _fileName = dlg.FileName _dirty = False UpdateUI() End Sub |
C#
C# |
拷贝代码
|
---|---|
public void SaveFile() { // 获取打开文件的名称 SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = _fileName; dlg.Title = "Save Report Definition File"; if (dlg.ShowDialog() != DialogResult.OK) return; // 保存文件 XmlTextWriter w = new XmlTextWriter(dlg.FileName, System.Text.Encoding.Default); w.Formatting = Formatting.Indented; w.Indentation = 2; w.WriteStartDocument(); // 写入所有报表 Cursor = Cursors.WaitCursor; w.WriteStartElement("Reports"); foreach (ReportHolder rh in _list.Items) rh.Report.Save(w); //rh.Report.ReportName; w.WriteEndElement(); Cursor = Cursors.Default; // 关闭文件 w.Close(); // 完成 _fileName = dlg.FileName; _dirty = false; UpdateUI(); } |