如何组织此代码以在显示窗口后加载报告
本文关键字:窗口 加载 报告 显示 何组织 代码 | 更新日期: 2023-09-27 18:21:32
我正在尝试将xml文件加载到数据集中,并使用加载的数据生成crystal报告。
我正在使用Crystal Reports WPF应用程序进行项目。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
reportViewer.Owner = this;
DataSet dset = new DataSet1();
DataSet reportData = new DataSet();
reportData.ReadXml("http://192.168.1.10/test/persons.xml");
dset.Tables[0].Merge(reportData.Tables[0]);
ReportDocument report = null;
report = new CrystalReport1();
report.SetDataSource(dset.Tables[0]);
reportViewer.ViewerCore.ReportSource = report;
}
}
这很好,我的问题是如何在应用程序显示后将下载xml和设置报告代码移动到不同的事件以加载报告?
问候
以下是窗口生存期管理事件:(MSDN)
- 已激活
- 已关闭
- 交割
- 已停用
- 源初始化
我相信Activated
活动正是您所需要的。考虑到Activated
事件不仅在窗口第一次打开时触发,而且在ALT+TAB开关等时也会触发,因此要从其他激活事件中筛选出第一个windo打开,只需在第一次处理Activated
事件时使用布尔标志将其设置为true:
bool firstActivateAlreadyHandled = false;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (!this.firstActivateAlreadyHandled)
{
// your code here
this.firstActivateAlreadyHandled = true;
}
}
不能100%确定你想要的是什么,如果你想在其他地方处理文件的下载,那么你可以读取远程文件,在本地保存,然后保存后更新报告,如果你只想在窗口显示后处理远程文件,那么我不确定,我假设你指的是一个表单,这意味着在表单上你会做这样的事情:
Private void Form1_Shown(object sender, EventArgs e)
{
DataSet dset = new DataSet1();
DataSet reportData = new DataSet();
reportData.ReadXml("http://192.168.1.10/test/persons.xml");
dset.Tables[0].Merge(reportData.Tables[0]);
ReportDocument report = null;
report = new CrystalReport1();
report.SetDataSource(dset.Tables[0]);
reportViewer.ViewerCore.ReportSource = report;
}
正如你所说的,这是为了WPF尝试。。。。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataSet dset = new DataSet1();
DataSet reportData = new DataSet();
reportData.ReadXml("http://192.168.1.10/test/persons.xml");
dset.Tables[0].Merge(reportData.Tables[0]);
ReportDocument report = null;
report = new CrystalReport1();
report.SetDataSource(dset.Tables[0]);
reportViewer.ViewerCore.ReportSource = report;
}
或
private void Window_ContentRendered(object sender, RoutedEventArgs e)
{
DataSet dset = new DataSet1();
DataSet reportData = new DataSet();
reportData.ReadXml("http://192.168.1.10/test/persons.xml");
dset.Tables[0].Merge(reportData.Tables[0]);
ReportDocument report = null;
report = new CrystalReport1();
report.SetDataSource(dset.Tables[0]);
reportViewer.ViewerCore.ReportSource = report;
}
如果您关心UI响应,即加载会停止应用程序流,则可以在其他线程中启动它。就这样包起来吧。
public Window1()
{
InitializeComponent();
new Task(() =>
{
Dispatcher.BeginInvoke(new Action(() =>
{
reportViewer.Owner = this;
DataSet dset = new DataSet1();
DataSet reportData = new DataSet();
reportData.ReadXml("http://192.168.1.10/test/persons.xml");
dset.Tables[0].Merge(reportData.Tables[0]);
ReportDocument report = null;
report = new CrystalReport1();
report.SetDataSource(dset.Tables[0]);
reportViewer.ViewerCore.ReportSource = report;
}), null);
}).Start();
}